如果我有这种图式。

person = {
    name : String,
    favoriteFoods : Array
}

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

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

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

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


当前回答

mongodb中没有$contains操作符。

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

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

其他回答

尽管同意find()在您的用例中是最有效的。仍然有$match的聚合框架,以简化大量条目的查询,并生成少量对您有价值的结果,特别是用于分组和创建新文件。

PersonModel.aggregate ([ { " $匹配":{ 和美元:[{favouriteFoods:{$存在:真的,$:['寿司 ']}}, ........]} }, {$project: {"_id": 0, "name": 1}} ]);

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

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

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

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

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

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

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

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

如果lookup_food_array是array。

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

如果lookup_food_array是string。

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

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

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