sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb hitta inuti sub array

Du är på rätt väg, men det finns några saker att notera här, förutom den delen att kapslade arrayer (och speciellt med anonyma nycklar) inte precis är ett bra sätt att lagra saker på, men så länge du konsekvent känner till positionen då det borde vara någorlunda okej.

Det finns en tydlig skillnad mellan matchande dokument och matchande "element av en array" . Även om ditt nuvarande värde faktiskt inte skulle matcha (ditt sökvärde ligger inte inom dokumentets gränser), om värdet faktiskt var giltigt matchar din fråga korrekt "dokument" här, som innehåller ett matchande element i arrayen.

"dokumentet" innehåller alla av arrayelementen, även de som inte matchar, men villkoret säger "dokument" matchar, så det returneras. Om du bara vill ha matchande "element" använd sedan .aggregate() istället:

    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" }
        }}

    ])

Och det returnerar bara de element som matchade villkoret:

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

Eller kurs om du bara förväntade dig en element för att matcha, då kan du helt enkelt använda projektion med .find() **:

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

Men med en term som $gt du kommer sannolikt att få flera träffar i ett dokument så den aggregerade metoden kommer att bli säkrare med tanke på att den positionella $ operatören kommer bara att returnera den första match.




  1. Översätt Queryable<T> tillbaka till IMongoQuery

  2. Mongoose/mongoDB-frågan går med... men jag kommer från en SQL-bakgrund

  3. Uppgradering till ClusterControl Enterprise Edition

  4. Mest populära NoSQL-databaser som stöds av ClusterControl