sql >> Database >  >> NoSQL >> MongoDB

Mongoose krijgt documenten die overeenkomen met de array

Zolang je je realiseert dat je overeenkomt met de ObjectId en niet echt iets in de verzameling waarnaar wordt verwezen, kun je de $in operator:

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

Waar dat natuurlijk uw werkelijke ObjectId-waarden zijn.

Maar als je echt een document bedoelt dat precies die array heeft, geef je de array gewoon door:

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

En als het beide elementen moet hebben maar andere zou kunnen hebben, dan moet je momenteel een $and uitdrukking:

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

Maar vanaf release 2.6 en later kun je de gebruiken $all operator om effectief hetzelfde te doen:

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

De andere vorm komt alleen overeen met die twee elementen, maar in willekeurige volgorde. Er zijn dus twee benaderingen:

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

Dit gebruikt een logische $or om te zeggen dat de array exact moet zijn, maar op beide manieren kan worden gerangschikt. En de andere benadering:

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

Dit zou dus $size gebruiken om er zeker van te zijn dat wanneer de array beide elementen bevat die overeenkwamen, dat ook slechts twee heeft elementen. Dat is een mooiere syntaxis dan het gebruik van $or , vooral voor grotere arrays.

En in de toekomstige releases zoals vermeld wordt dit nog schoner:

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

Dat dekt vrijwel elke interpretatie




  1. Hoe _id verbergen voor aggregatie?

  2. Fout bij het instellen van samengestelde index

  3. Hoe geef ik de HGET/GET-opdracht voor Redis Database via Node.js?

  4. mangoest findByIdAndDelete / findOneAndRemove niet verwijderen