MongoDB只从嵌套数组中获取匹配元素

时间:2017-03-04 10:00:52

标签: mongodb mongodb-query aggregation-framework

我有一个这样的集合:

{
_id : 123,
username : "xy",
comments : [
    {
        text : "hi",
        postdate : 123456789
    },
    {
        text : "hi1",
        postdate : 555555555
    },
    {
        text : "hi2",
        postdate : 666666666
    },
    {
        text : "hi3",
        postdate : 987654321
    }

]}

现在我只想发布555555555或更高版本以及987654321或更低版本的评论。我有这个查询,但它不起作用:

db.post.aggregate([
{$match : {$and : [ 
{"_id": ObjectId("123")},
{"comments.posttime" : {$lte : 987654321}},
{"comments.posttime" : {$gte : 555555555}}
]}}
,{$unwind: "$comments"}]).pretty();

但是当我尝试这个时,它会得到我所有的数组元素。该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:2)

使用$ redact来限制文档的内容,

                db.an.aggregate([{
        $redact: {
            "$cond": [{
                $and: [{
                    "$gte": [{
                            "$ifNull": ["$postdate", 555555555]
                        },
                        555555555
                    ]
                }, {
                    "$lte": [{
                            "$ifNull": ["$postdate", 987654321]
                        },
                        987654321
                    ]
                }]
            }, "$$DESCEND", "$$PRUNE"]
        }
    }]).pretty()

答案 1 :(得分:0)

你必须首先解开评论,然后进行比赛。这样注释数组将被展平,匹配条件可以正确过滤它。

[{$unwind: "$comments"},{$match : {$and : [ 
{"_id": ObjectId("123")},
{"comments.posttime" : {$lte : 987654321}},
{"comments.posttime" : {$gte : 555555555}}
]}}]

这将为每个注释分配一行,如果你想在数组中使用匹配的注释,请在_id上使用aggregate并按$推送注释