MongoDB过滤对象

时间:2016-12-15 17:00:50

标签: mongodb database

我有一个这样的文件:

-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。

提前致谢。

2 个答案:

答案 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 回答