查找包含特定值的数组
如果我有这个模式…
person = { name : String, favoriteFoods : Array }
… favoriteFood
数组中填充了string。 我怎样才能find所有使用mongoose的“寿司”作为他们喜欢的食物?
我希望有以下几点:
PersonModel.find({ favoriteFood : { $contains : "sushi" }, function(...) {...});
(我知道在mongodb中没有$contains
,只是解释了我在得知解决scheme之前期望find的东西)
作为favouriteFoods
是一个简单的string数组,你可以直接查询该字段:
PersonModel.find({ favouriteFoods: "sushi" }, ...);
但是我也build议在你的模式中显式的使用string数组:
person = { name : String, favouriteFoods : [String] }
在mongodb中没有$contains
操作符。
你可以使用JohnnyHK的答案。 包含mongo的最接近的比喻是$in
,使用这个查询将看起来像:
PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);
如果你需要在子文档数组中find包含NULL元素的文档,我发现这个查询很好用:
db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})
这个查询是从这个职位: MongoDb查询数组与空值
这是一个伟大的发现,它比我自己的初始和错误版本(原来只适用于有一个元素的数组)工作得更好:
.find({ 'MyArrayOfSubDocuments': { $not: { $size: 0 } }, 'MyArrayOfSubDocuments._id': { $exists: false } })
我觉得在这种情况下$all
都会更合适。 如果你正在寻找寿司的人,你可以这样做:
PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})
正如你可能想过滤更多的search,像这样:
PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})
$in
就像OR和$all
像AND。 选中此项: https : //docs.mongodb.com/manual/reference/operator/query/all/
例如,如果数组包含对象,如果favouriteFoods
是以下对象的数组:
{ name: 'Sushi', type: 'Japanese' }
您可以使用以下查询:
PersonModel.find({"favouriteFoods.name": "Sushi"});
我知道这个话题已经很老了,但是对于那些想知道同样的问题的未来的人来说,另一个令人难以置信的低效率的解决scheme可能是:
PersonModel.find({$where : 'this.favouriteFoods.indexOf("sushi") != -1'});
这避免了MongoDB的所有优化,所以不要在生产代码中使用。