如果我有这种图式。

person = {
    name : String,
    favoriteFoods : Array
}

... 其中favoriteFoods数组用字符串填充。我怎样用猫鼬找到所有喜欢吃“寿司”的人?

我希望你能说出这样的话:

PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});

(我知道mongodb中没有$contains,只是解释了我在知道解决方案之前希望找到什么)


当前回答

由于favoritefoods是一个简单的字符串数组,你可以直接查询该字段:

PersonModel.find({ favouriteFoods: "sushi" }, ...); // favouriteFoods contains "sushi"

但我也建议在你的schema中显式地使用string数组:

person = {
    name : String,
    favouriteFoods : [String]
}

相关文档可以在这里找到:https://docs.mongodb.com/manual/tutorial/query-arrays/

其他回答

如果你需要在子文档数组中查找包含NULL元素的文档,我发现这个查询工作得很好:

db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})

这个查询来自这篇文章:空值的MongoDb查询数组

这是一个伟大的发现,它比我自己最初的错误版本(原来只适用于只有一个元素的数组)要好得多:

.find({
    'MyArrayOfSubDocuments': { $not: { $size: 0 } },
    'MyArrayOfSubDocuments._id': { $exists: false }
})

对于Loopback3,所有给出的例子都不适合我,或者无论如何都不如使用REST API快。但它帮助我找到了我需要的确切答案。

{"where":{"arrayAttribute":{"all":[String]}}}

如果你在一个对象数组中搜索,你可以使用$elemMatch。例如:

PersonModel.find({ favoriteFoods : { $elemMatch: { name: "sushiOrAnytthing" }}});

如果lookup_food_array是array。

match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}

如果lookup_food_array是string。

match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}

如果数组包含对象,例如,如果favoritefoods是以下对象的数组:

{
  name: 'Sushi',
  type: 'Japanese'
}

您可以使用以下查询:

PersonModel.find({"favouriteFoods.name": "Sushi"});