2017-02-20 29 views
0

我想应用条件的Mongo Db的聚合输出,但仍然没有弄清楚这个想法。下面是我的示例文件:如何应用过滤器来输出Mongo Db的聚合框架?

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

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

这里的文件我最初点,这让分(顾客审查):产生

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

您可以使用$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 ] } ]} 
+0

非常感谢替换值,所以如何在列表中,如“在租赁1专家评审> 8”的每一个元素执行条件。我尝试:{$或:[{$ gt:[{$ min:“$ customerReviews”},5]},{expertReviews:{$ elemMatch:{$ gt:8}}}]}但它返回无法识别的表达式$ elemMatch - InvalidPipelineOperator。最后一个问题:所有这些查询都可以使用BasicDbObject for Java来完成,对吧? – keduadoi

+0

不客气。所有操作都在java驱动程序中受支持。 '$ elemmatch'只能在'$ match'stage中使用。我不能想到聚合管道中的任何类似的操作员。 – Veeram