如果我有这种图式。

person = {
    name : String,
    favoriteFoods : Array
}

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

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

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

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


当前回答

mongodb中没有$contains操作符。

你可以使用来自JohnnyHK的答案。与包含mongo的最接近的类比是$in,使用这个你的查询将看起来像:

PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);

其他回答

我知道这个话题很老了,但对于未来可能会想知道同样问题的人来说,另一个非常低效的解决方案可能是:

PersonModel.find({$where : 'this.favouriteFoods.indexOf("sushi") != -1'});

这避免了MongoDB的所有优化,所以不要在生产代码中使用。

mongodb中没有$contains操作符。

你可以使用来自JohnnyHK的答案。与包含mongo的最接近的类比是$in,使用这个你的查询将看起来像:

PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);

如果你需要在子文档数组中查找包含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"] }, ...})

因为你可能想过滤更多的搜索,像这样:

PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})

$in是OR, $all是and。检查这个:https://docs.mongodb.com/manual/reference/operator/query/all/

在这段代码中使用populate & $将很有用。

ServiceCategory.find().populate({
    path: "services",
    match: { zipCodes: {$in: "10400"}},
    populate: [
        {
            path: "offers",
        },
    ],
});