2017-02-20 6 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持っているすべての文書を見つけるのような要件がある場合 - >のみ第2の文書が正しいことを。

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

生成します:ここで

は、文書の分(customerReview)を取得私の最初のポイントである

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

を、どのようにすべての文書を取得するために集約出力用のフィルタを適用し続けるためにどのmin_customer_review> 5ですか?

もう1つ質問があります。「min_customer_review> 5またはaverage_expert_reviews> 6のすべての映画を取得する」のような2番目の集計を適用できますか?

は、Uあなたは$redactを使用することができ、すべての

答えて

1

ありがとうございます。

$redactドキュメントを通過し、クエリ基準で$$KEEP$$PRUNEを実行します。

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

オペレーター$orに条件をラップすることができます。

は、「リース1エキスパートレビュー> 8時」のようなリストのすべての要素に条件を実行するので、どのように、

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

どうもありがとうとifブロック内の値を置き換えます。私は試してみます:{$ OR:{$ gt:[{$ min: "$ customerReviews"}、5]}、{expertReviews:{$ elemMatch:{$ gt:8}}}}} elemMatch - InvalidPipelineOperator。最後の質問:これらの種類のクエリはすべて、BasicDbObject for Javaを使用して行うことができます。 – keduadoi

+0

ようこそ。すべての操作はjavaドライバでサポートされています。 '$ elemmatch'は' $ match'stageでのみ動作します。私は、集約パイプラインで類似の演算子を考えることはできません。 – Veeram