Докато разбирате, че съвпадате с ObjectId, а не с нещо в референтната колекция, можете да използвате $in
оператор:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Разбира се, това са вашите действителни стойности на ObjectId.
Но ако наистина имате предвид документ, който има точно този масив, тогава просто предавате масива:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
И ако трябва да има и двата елемента, но може да има и други, тогава в момента трябва да използвате $и
израз:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Но от версия 2.6 и нататък можете правилно да използвате $all
оператор, за да направи ефективно същото:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
Другата форма съвпада само с тези два елемента, но в произволен ред. Така че има два подхода:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Това използва логически $or
за да кажем, че масивът трябва да е точен, но може да бъде подреден така или иначе. И другият подход:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Така че това ще използва $size
за да се уверите, че когато масивът съдържа и двата съвпадащи елемента, той също има само два елементи. Което е по-хубав синтаксис от използването на $orкод>
, особено за по-големи масиви.
И в бъдещите издания, както беше споменато, това става още по-чисто:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Това до голяма степен обхваща всяка интерпретация