2017-04-03 10 views
3

こんにちは私は以下の文書を持っています。複数の基準に基づいてメッセージエージェントからメッセージを抽出したいと思います。複数の一致条件に基づいてネストされたリストからサブ文書を返します

{ 
"_id" : ObjectId("58df770371043e7087cdaadd"), 
"prospectemailid" : "[email protected]", 
"prospectid" : "1491038545032", 
"useremail" : "[email protected]", 
"threadidslist" : [ 
    { 
     "threadid" : "15b28e8e711f71b0", 
     "subject" : "sub", 
     "campaignid" : "1491460056589", 
     "messagelist" : [ 
      { 
       "emailuniqueid" : "1492376430400", 
       "messageid" : "15b28e8e711f71b0", 
       "timestamp" : "Sat Apr 01 15:16:43 IST 2017", 
       "from" : "[email protected]", 
       "body" : "Hello", 
       "labelid" : "SENT", 
       "to" : "[email protected]", 
       "messageidpayload" : "" 
      }, 
      { 
       "emailuniqueid" : "1492376430400", 
       "messageid" : "15b28ecbcbe5b32d", 
       "timestamp" : "Sat Apr 01 15:20:54 IST 2017", 
       "from" : "[email protected]", 
       "body" : "Hi", 
       "labelid" : "RECEIVED", 
       "to" : "[email protected]", 
       "messageidpayload" : "<[email protected]om>" 
      } 
     ] 
    } 
] 

}

予定の基準に基づいて出力:prospectemailid = 1491038545032、USEREMAIL = XYZ @ gmail.com、threadidslist.campaignid = 1491460056589とmessagelist.emailuniqueid = 1492376430400が

{ 
       "emailuniqueid" : "1492376430400", 
       "messageid" : "15b28ecbcbe5b32d", 
       "timestamp" : "Sat Apr 01 15:20:54 IST 2017", 
       "from" : "[email protected]", 
       "body" : "Hi", 
       "labelid" : "RECEIVED", 
       "to" : [email protected]", 
       "messageidpayload" : "<[email protected]om>" 
} 

ありますありがとう..!

は、これまで私が試してみました:

db.getCollection('GD').aggregate(
[ 

    { $match:{ 
     "prospectid" : "1491038545032", 
     "useremail" : "[email protected]", 
     "threadidslist.campaignid" : "1491460056589", 
     "threadidslist.messagelist.emailuniqueid" : "1492376430400" 
    } 

} 
]) 
+0

@chridamモンゴバージョン:

は、所望の結果を得るために、次のパイプラインを実行している考えてみましょう3.4を、私は私がこれまでQUESで試してみました何が含まれています。 –

答えて

2

を濾過し、ネストされた配列を取得するために$projectパイプラインで$arrayElemAt$filter演算子を使用してください。 $replaceRootパイプラインは、フィルタ処理されたサブ文書をトップレベルに昇格させ、他のすべてのフィールドを置き換えます。

db.GD.aggregate([ 
    { "$match": { 
     "prospectid" : "1491038545032", 
     "useremail" : "[email protected]", 
     "threadidslist.campaignid" : "1491460056589", 
     "threadidslist.messagelist.emailuniqueid" : "1492376430400" 
    } }, 
    { "$project": { 
     "threadidslist": { 
      "$arrayElemAt": [ 
       { 
        "$filter": { 
         "input": "$threadidslist", 
         "as": "thread", 
         "cond": { "$eq": ["$$thread.campaignid", "1491460056589"] } 
        }     
       }, 
       0 
      ] 
     } 
    } }, 
    { "$project": { 
     "messagelist": { 
      "$arrayElemAt": [ 
       { 
        "$filter": { 
         "input": "$threadidslist.messagelist", 
         "as": "msg", 
         "cond": { "$eq": ["$$msg.emailuniqueid", "1492376430400"] } 
        }     
       }, 
       0 
      ] 
     } 
    } }, 
    { "$replaceRoot": { "newRoot": "$messagelist" } } 
]) 
+0

それは私に$ replacerootの認識できないパイプラインステージをエラーしますが、{"$ replaceRoot":{"newRoot": "$ messagelist"}}を削除した後にエラーが発生します。それは魅力のように働く。どうもありがとう ... :) –

関連する問題