如果我有这种图式。

person = {
    name : String,
    favoriteFoods : Array
}

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

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

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

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


当前回答

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

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

其他回答

如果你在一个对象数组中搜索,你可以使用$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}

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

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

我觉得在这种情况下用$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/

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

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

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