查找包含特定值的数组

如果我有这个模式…

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的所有优化,所以不要在生产代码中使用。