如果我有这种图式。
person = {
name : String,
favoriteFoods : Array
}
... 其中favoriteFoods数组用字符串填充。我怎样用猫鼬找到所有喜欢吃“寿司”的人?
我希望你能说出这样的话:
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
(我知道mongodb中没有$contains,只是解释了我在知道解决方案之前希望找到什么)
如果你需要在子文档数组中查找包含NULL元素的文档,我发现这个查询工作得很好:
db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})
这个查询来自这篇文章:空值的MongoDb查询数组
这是一个伟大的发现,它比我自己最初的错误版本(原来只适用于只有一个元素的数组)要好得多:
.find({
'MyArrayOfSubDocuments': { $not: { $size: 0 } },
'MyArrayOfSubDocuments._id': { $exists: false }
})
由于favoritefoods是一个简单的字符串数组,你可以直接查询该字段:
PersonModel.find({ favouriteFoods: "sushi" }, ...); // favouriteFoods contains "sushi"
但我也建议在你的schema中显式地使用string数组:
person = {
name : String,
favouriteFoods : [String]
}
相关文档可以在这里找到:https://docs.mongodb.com/manual/tutorial/query-arrays/
我觉得在这种情况下用$all更合适。如果你正在寻找一个喜欢吃寿司的人,你可以:
PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})
因为你可能想过滤更多的搜索,像这样:
PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})
$in是OR, $all是and。检查这个:https://docs.mongodb.com/manual/reference/operator/query/all/
如果你需要在子文档数组中查找包含NULL元素的文档,我发现这个查询工作得很好:
db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})
这个查询来自这篇文章:空值的MongoDb查询数组
这是一个伟大的发现,它比我自己最初的错误版本(原来只适用于只有一个元素的数组)要好得多:
.find({
'MyArrayOfSubDocuments': { $not: { $size: 0 } },
'MyArrayOfSubDocuments._id': { $exists: false }
})