我有一个这样的文件:
-document: users-
{
"name": "x", password: "x" recipes:
[{title: eggs, dificult: 1},{title: "pizza" dificult: 2}],
name: "y", password: "y" recipes: [{title: "oil", dificult: 2},{title: "eggandpotatoes" dificult: 2}]
}
我想通过标题和难以过滤的所有食谱进行过滤
我尝试过像这样的
db.users.find({$and: [{"recipes.title": /.*egg.*/},{"recipes.dificult": 2}]},
{"recipes.title": 1,"recipes.dificult": 1}).toArray();
这应该返回
{title: "eggandpotatoes" dificult: 2}
但返回
{title: eggs, dificult: 1}
{title: "eggandpotatoes" dificult: 2}
我希望一旦过滤器工作,用start:2和end:5限制结果 从2结果返回下一个5。
提前致谢。
答案 0 :(得分:1)
您可以使用 $filter 聚合来过滤食谱, $slice 限制结果。它将为您提供您期望的所有内容,但正如现在一样无法进行正则表达式搜索。
db.users.aggregate([{
$project: {
_id: 0,
recipes: {
$slice: [{
$filter: {
input: "$recipes",
as: "recipe",
"cond": {
$and: [{
$eq: ["$$recipe.title", "eggandpotatoes"]
}, {
$eq: ["$$recipe.dificult", 2]
}]
}
}
}, 2, 3]
}
}
}]);
答案 1 :(得分:0)
如果您需要在title
中查找正则表达式,请使用$elemMatch,如下所示:
db.users.find({"recipes":{"$elemMatch":{"title": /.*egg.*/,"dificult": 2}}}, {"recipes.$":1})
如果您的recipes
数组包含类似这样的内容,我在这里提到的一件事
"recipes" : [ { "title" : "egg", "dificult" : 2 }, { "title" : "eggand", "dificult" : 2 } ]
然后 $ 投影返回第一个匹配的数组objcect,在上面的情况下它将是
"recipes" : [ { "title" : "egg", "dificult" : 2 } ]
如果你需要这两个阵列,那么使用聚合 @Sagar 回答