MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose erhält Dokumente, die mit dem Array übereinstimmen

Solange Sie erkennen, dass Sie mit der ObjectId und nicht mit irgendetwas in der referenzierten Sammlung übereinstimmen, können Sie den $in Betreiber:

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

Wobei das natürlich Ihre tatsächlichen ObjectId-Werte sind.

Aber wenn Sie wirklich ein Dokument meinen, das genau dieses Array hat, dann übergeben Sie einfach das Array:

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

Und wenn es beide Elemente haben muss, aber andere haben könnte, müssen Sie derzeit ein $and Ausdruck:

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

Aber ab Release 2.6 und höher können Sie den ordnungsgemäß verwenden $all Operator, um dasselbe effektiv zu tun:

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

Das andere Formular gleicht nur diese beiden Elemente ab, aber in beliebiger Reihenfolge. Es gibt also zwei Ansätze:

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

Dies verwendet einen logischen $or zu sagen, dass das Array genau sein muss, aber in beide Richtungen angeordnet werden kann. Und der andere Ansatz:

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

Dies würde also $size verwenden um sicherzustellen, dass, wenn das Array beide übereinstimmenden Elemente enthielt, es auch nur zwei hatte Elemente. Das ist eine schönere Syntax als die Verwendung von $or , insbesondere für größere Arrays.

Und in den zukünftigen Versionen wird dies, wie erwähnt, noch sauberer:

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

Das deckt so ziemlich jede Interpretation ab