WebHU - Programozási kérdések és válaszok

Hogyan lehet létrehozni egy mongodb lekérdezést, amely megállapítja, hogy egy szám két mező között van?

Az adatbázisban lévő objektumok rendelkeznek egy „tulajdonságok” tömbbel, amely különféle objektumokat tartalmazhat. Némelyikük számokat vagy tartományokat mutat be, és így néz ki:

{'value': 10}

or

{'minValue': 4, 'maxValue': 8}

Amikor egy adott számra, például X-re kérdezek le a gyűjteményben, meg akarok találni minden olyan dokumentumot, ahol valamelyik érték egyenlő X-szel vagy minValue ‹= X ‹= maxValue. Az első lekérdezési kísérletem így néz ki

db.Pool0.find({$or: [{'properties.value': X}, {'properties.minValue': {$lte: X}, 'properties.maxValue': {$gte: X}}]}, {'_id': 1}).pretty()

A hátránya az, hogy ha a tulajdonságtömb több objektumot tartalmaz, amelyek a minValue-t és a maxValue-t adják meg, akkor X bármelyik között lehet. Például

"properties" : [
    {
        "minValue" : 4,
        "maxValue" : 6
    },
    {
        "minValue" : 10,
        "maxValue" : 20
    }
]

egyezik X = 8 esetén. Javítható-e a lekérdezés úgy, hogy a tulajdonságokon belüli objektumstruktúra tiszteletben maradjon?


  • Tudsz mutatni néhány gyűjteményi dokumentumot? 11.04.2014

Válaszok:


1

Alapvetően a $elemMatch kombinációt szeretné használni $or feltétellel ezen az űrlapon :

db.collection.find({
    "$or": [
        {
            "properties": { "$elemMatch": {
                "minValue": { "$lte": 8 },
                "maxValue": { "$gte": 8 }
            }}
        },
        {
            "properties.value": 8
        }
    ]
})

Ez magában foglalja a tartományt tartalmazó dokumentumok teljesítését, valamint a tulajdonságok mezőjének lehetséges másik kulcsnevét.

De ne feledje, hogy a dokumentumok egyeztetése különbözik a tömb elemeinek egyeztetésétől. Tehát ha csak arra számít, hogy a megfelelő tömbelemeket adják vissza, és több is van, akkor használja az összesített űrlapot:

db.collection.aggregate([
    // Matching documents is still good practice
    { "$match": {
        "$or": [
             {
                 "properties": { "$elemMatch": {
                    "minValue": { "$lte": 8 },
                    "maxValue": { "$gte": 8 }
                 }}
             },
             {
                 "properties.value": 8
             }
         ]
    }},

    // Unwind to de-normalize
    { "$unwind": "$properties" },

    // Then match to filter the elements
    { "$match": {
        "$or": [
             {
                "properties.minValue": { "$lte": 8 },
                "properties.maxValue": { "$gte": 8 }
             },
             { "properties.value": 8 }
        ]
    }},

    // Reconstruct the filtered array
    { "$group": {
        "_id": "$_id",
        "properties": { "$push": "$properties" }
    }}
])

De ha csak egy egyezés lesz biztos, akkor egyszerűen használja a kivetítést a find funkcióval:

db.collection.find(
    { 
        "$or": [
            {
                "properties": { "$elemMatch": {
                    "minValue": { "$lte": 8 },
                    "maxValue": { "$gte": 8 }
                }}
            },
            {
            "properties.value": 8
            }
        ]
    },
    { "properties.$": 1 }
)
11.04.2014
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..