如何应用过滤器来输出Mongo Db的聚合框架?

时间:2017-02-20 18:12:29

标签: mongodb aggregation-framework

我试图为Mongo Db的聚合输出应用条件,但仍然没有弄清楚这个想法。以下是我的示例文档:

{
 'id':1,
 'customerReviews':[5,7,8],
 'expertReviews':[9,8,9]
},
{
 'id':1,
 'customerReview':[6,7,7],
 'expertReview':[4,8,9]
}

所以,如果我有一个要求,比如找到所有有min(customer_review)>的文件。 5 - >只有第二份文件是正确的。

以下是获取文档的最小值(customerReview)的初始点:

db.getCollection('subscriber').aggregate([
{$unwind:"$customerReviews"},
{"$group":{
   "_id":"$_id",
   "min_customer_review":{"$min":"$customerReviews"}}}
]);

产生:

{
  "_id" : ObjectId("58ab1d6892bf3194a9719883"),
  "min_customer_review" : 5
},
{
  "_id" : ObjectId("58ab1d6892bf3194a9719883"),
  "min_customer_review" : 6
}

那么如何继续为聚合输出应用过滤器以获取具有min_customer_review>的所有文档5?

还有一个问题,是它能够应用第二个聚合,例如"获取所有具有min_customer_review>的电影。 5或average_expert_reviews> 6" ?

谢谢大家

1 个答案:

答案 0 :(得分:1)

您可以使用$redact

$redact浏览文档并对查询条件执行$$KEEP$$PRUNE

db.subscriber.aggregate(
    [{
        $redact: {
            $cond: {
                if: {
                    $gt: [{
                        $min: "$customerReviews"
                    }, 5]
                },
                then: "$$KEEP",
                else: "$$PRUNE"
            }
        }
    }]
);

您可以在$or运算符中包含更多条件。

if块中的值替换为

{ $or:[{$gt: [{ $min: "$customerReviews"}, 5 ] }, {$gt: [{ $avg: "$expertReviews"}, 6 ] } ]}