sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoose får dokument som matchar arrayen

Så länge du inser att du matchar på ObjectId och inte faktiskt någonting i den refererade samlingen kan du använda $in operatör:

db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })

Där det naturligtvis är dina faktiska ObjectId-värden.

Men om du verkligen menar ett dokument som har exakt den arrayen, så skickar du bara in i arrayen:

db.collection.find({ "members": [ "some id 1", "some id 2" ] })

Och om den måste ha båda elementen men kan ha andra måste du för närvarande använda en $and uttryck:

db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" } 
]})

Men från version 2.6 och framåt kan du korrekt använda $all operatör för att effektivt göra detsamma:

db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })

Den andra formen matchar bara dessa två element, men i valfri ordning. Så det finns två tillvägagångssätt:

db.collection.find({ "$or": [
    { "members": [ "some id 1", "some id 2" ] },
    { "members": [ "some id 2", "some id 1" ] }
]})

Detta använder en logisk $or att säga att arrayen måste vara exakt men kan ordnas åt båda hållen. Och det andra tillvägagångssättet:

db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" }
    { "members": { "$size": 2 } }
]})

Så detta skulle använda $size för att se till att när arrayen innehöll båda elementen som matchade så hade den bara två element. Vilket är en trevligare syntax än att använda $or , speciellt för större arrayer.

Och i framtida utgåvor blir detta som sagt ännu renare:

db.collection.find({ "$and": [ 
    { "members": { "$all": [ "some id 1", "some id 2" ] } },
    { "members": { "$size": 2 } }
]})

Det täcker ganska mycket varje tolkning




  1. Meteor Subscribe uppdaterar inte sorteringsordningen för samlingen

  2. MongoDb finns per kolumn

  3. MongoDb-förklaring misslyckades:okänd operatör på toppnivå:$query

  4. Mongo Ger 'duplicerat nyckelfel' på icke-unika fält