sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb find inde i sub-array

Du er på rette vej, men der er et par ting at bemærke her, bortset fra den del, at indlejrede arrays (og især med anonyme nøgler) ikke ligefrem er en god måde at gemme ting på, men så længe du konsekvent kender positionen det burde være nogenlunde i orden.

Der er en klar forskel mellem matchende dokumenter og matchende "elementer af et array" . Selvom din aktuelle værdi faktisk ikke ville matche (din søgeværdi er ikke inden for dokumentets grænser), hvis værdien faktisk var gyldig, matcher din forespørgsel korrekt "dokumentet" her, som indeholder et matchende element i arrayet.

"dokumentet" indeholder alle af array-elementerne, selv dem der ikke matcher, men betingelsen siger "dokument" matcher, så den returneres. Hvis du bare vil have de matchende "elementer" brug derefter .aggregate() i stedet:

    db.infos.aggregate([
        // Still match the document
        { "$match": { 
            "info": { 
                "$elemMatch": { "0": {"$gte": 1399583285000} }
            }
        }},

        // unwind the array for the matched documents
        { "$unwind": "$info" },

        // Match only the elements
        { "$match": { "info.0": { "$gte": 1399583285000 } } },

        // Group back to the original form if you want
        { "$group": {
            "_id": "$_id",
            "info": { "$push": "$info" }
        }}

    ])

Og det returnerer kun de elementer, der matchede betingelsen:

{
    "_id" : ObjectId("536c1145e99dc11e65ed07ce"),
    "info" : [
            [
                    1399583285000,
                    20.13
            ],
            [
                    1399583286000,
                    20.13
            ]
    ]
}

Eller kursus, hvis du nogensinde kun forventede én element til at matche, så kan du blot bruge projektion med .find() **:

db.infos.find(
    {
       "info":{
          "$elemMatch":{
             "0": {
                "$gt": 1399583285000
             }
          }
       }
    },
    {
        "info.$": 1
    }
)

Men med et udtryk som $gt du vil sandsynligvis få flere hits i et dokument, så den samlede tilgang vil være mere sikker i betragtning af, at den positionelle $ operatøren vil kun returnere den første match.




  1. MongoDB insertMany()

  2. Hvad kan gøres ved at bruge CKANs asynkrone baggrundsjob?

  3. Mongodb samlet sortering og begrænsning inden for gruppen

  4. Seks kritiske komponenter i en vellykket dataforvaltning