Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongo Db聚合框架的输出如何应用过滤器?_Mongodb_Aggregation Framework - Fatal编程技术网

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

Mongodb Mongo Db聚合框架的输出如何应用过滤器?,mongodb,aggregation-framework,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] } db.getCollection('subscriber').aggregate([ {$unwind:"$customerReviews"},

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

{
 'id':1,
 'customerReviews':[5,7,8],
 'expertReviews':[9,8,9]
},
{
 'id':1,
 'customerReview':[6,7,7],
 'expertReview':[4,8,9]
}
db.getCollection('subscriber').aggregate([
{$unwind:"$customerReviews"},
{"$group":{
   "_id":"$_id",
   "min_customer_review":{"$min":"$customerReviews"}}}
]);
因此,如果我有一个像查找所有文档这样的需求,它的min(customer\u review)>5->只有第二个文档是正确的

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

{
 'id':1,
 'customerReviews':[5,7,8],
 'expertReviews':[9,8,9]
},
{
 'id':1,
 'customerReview':[6,7,7],
 'expertReview':[4,8,9]
}
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
}
那么,如何继续对聚合输出应用过滤器,以获得所有最小客户审核>5的文档

还有一个问题,它是否能够应用第二个聚合,比如“获取所有最低客户评论>5或平均专家评论>6的电影”


谢谢大家

您可以使用
$redact

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

db.subscriber.aggregate(
    [{
        $redact: {
            $cond: {
                if: {
                    $gt: [{
                        $min: "$customerReviews"
                    }, 5]
                },
                then: "$$KEEP",
                else: "$$PRUNE"
            }
        }
    }]
);
您可以在
$或
运算符中包装更多条件

if
块中的值替换为

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

非常感谢,所以如何对列表中的每个元素执行条件,如“至少1个专家评审>8”。我尝试:{$or:[{$gt:[{$min:$customerReviews},5]},{expertReviews:{$elemMatch:{$gt:8}}}}]},但它返回了无法识别的表达式$elemMatch-InvalidPipelineOperator。最后一个问题:所有这些类型的查询都可以使用BasicDbObject for Java完成,对吗?不客气。java驱动程序支持所有操作
$elemmatch
仅在
$match
阶段有效。我想不出在聚合管道中有任何类似的操作符。