2017-02-20 27 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