sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB kapslad arrayfråga

Efter att ha kört några frågor kom jag till slutsatsen att $in inte fungerar för en array av arrayer .

Du kan använda $elemMatch istället och det kommer att fungera, men det är frustrerande att MongoDB:s dokumentation inte varnar för det.

Jag skapade det här dokumentet:

{
      "_id": "51cb12857124a215940cf2d4",
      "level1": [
        [
          "item00",
          "item01"
        ],
        [
          "item10",
          "item11"
        ]
      ],
      "items": [
        "item20",
        "item21"
      ]
}

Lägg märke till att fältet "objekt" är en rad strängar och den här frågan fungerar perfekt:

db.nested.findOne({"items":{"$in":["item20"]} })

Nu är "level1.0" också en array av strängar, den enda skillnaden är att den finns i en annan array. Den här frågan borde fungera men är inte:

db.nested.findOne({"level1.0":{"$in":["item00"]} })

Det enda sättet att få resultatet är att använda $elemMatch:

db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} })

Alltså $elemMatch löser problemet, men den verkliga lösningen är att uppdatera MongoDBs dokumentation till att $in fungerar inte för arrayer av arrayer. Du kanske borde skicka in en förfrågan till 10gen.



  1. MongoDB "kan inte hitta index för $geoNear-frågan"

  2. Lagring av kapslade javascript-objekt i redis - NodeJS

  3. För- och nackdelar med att använda selleri vs. RQ

  4. Hur kan jag lagra tid på dagen i MongoDB? Som ett snöre? Ge godtyckligt år/månad/dag?