2016-06-01 26 views
1

次のMongodbドキュメントがあります。参加者= 'xxx'と(message.touserid = 'xxx'またはmessage.fromuserid = 'xxx')の間でドキュメントを取得しますか?Mongodbクエリ選択埋め込みドキュメント

次のクエリを使用していますが、1つではなくすべてのメッセージを返しています。この結果を達成する方法を教えてください。

{ "$and" : [ { "participants" : { "$regex" : "56d314a8e4b04d7f98cfd0c6"} , "$or" : [ { "messages.touserId" : "56d314a8e4b04d7f98cfd0c6"} , { "messages.formuserId" : "56d314a8e4b04d7f98cfd0c6"}]}]} fields: { "_id" : "0" , "product" : "0" , "participants" : "0" , "messages" : "0"}

{ 
    "_id": { 
    "$oid": "574eb878027520c2158268d6" 
    }, 
    "_class": "com.idearealty.product.shopchat.persistence.model.Discussion", 
    "participants": "56d314a8e4b04d7f98cfd0c6,56d5d48ee4b0cc330f512a47,56d9d599e4b0cc330f512aaa,57130299e4b08c554c1092c7,56841002eceefce22f455c7f", 
    "messages": [ 
    { 
     "_id": { 
     "$oid": "574eb874027520c2158268d2" 
     }, 
     "formuserId": "56841002eceefce22f455c7f", 
     "fromuser": "9674642375", 
     "touserId": "56d314a8e4b04d7f98cfd0c6", 
     "touser": "debopam_r", 
     "message": "Creating Discussion", 
     "isMute": false, 
     "index": 1, 
     "createDate": { 
     "$date": "2016-06-01T10:27:00.500Z" 
     }, 
     "lastModifiedDate": { 
     "$date": "2016-06-01T10:27:00.501Z" 
     }, 
     "createdBy": "9674642375", 
     "lastModifiedBy": "9674642375" 
    }, 
    { 
     "_id": { 
     "$oid": "574eb875027520c2158268d3" 
     }, 
     "formuserId": "56841002eceefce22f455c7f", 
     "fromuser": "9674642375", 
     "touserId": "56d5d48ee4b0cc330f512a47", 
     "touser": "Raushan", 
     "message": "Creating Discussion", 
     "isMute": false, 
     "index": 2, 
     "createDate": { 
     "$date": "2016-06-01T10:27:01.295Z" 
     }, 
     "lastModifiedDate": { 
     "$date": "2016-06-01T10:27:01.295Z" 
     }, 
     "createdBy": "9674642375", 
     "lastModifiedBy": "9674642375" 
    }, 
    { 
     "_id": { 
     "$oid": "574eb875027520c2158268d4" 
     }, 
     "formuserId": "56841002eceefce22f455c7f", 
     "fromuser": "9674642375", 
     "touserId": "56d9d599e4b0cc330f512aaa", 
     "touser": "anirbanshop1", 
     "message": "Creating Discussion", 
     "isMute": false, 
     "index": 3, 
     "createDate": { 
     "$date": "2016-06-01T10:27:01.962Z" 
     }, 
     "lastModifiedDate": { 
     "$date": "2016-06-01T10:27:01.962Z" 
     }, 
     "createdBy": "9674642375", 
     "lastModifiedBy": "9674642375" 
    }, 
    { 
     "_id": { 
     "$oid": "574eb876027520c2158268d5" 
     }, 
     "formuserId": "56841002eceefce22f455c7f", 
     "fromuser": "9674642375", 
     "touserId": "57130299e4b08c554c1092c7", 
     "touser": "dummyshop", 
     "message": "Creating Discussion", 
     "isMute": false, 
     "index": 4, 
     "createDate": { 
     "$date": "2016-06-01T10:27:02.574Z" 
     }, 
     "lastModifiedDate": { 
     "$date": "2016-06-01T10:27:02.574Z" 
     }, 
     "createdBy": "9674642375", 
     "lastModifiedBy": "9674642375" 
    } 
    ], 
    "messageCount": 4, 
    "createDate": { 
    "$date": "2016-06-01T10:27:04.041Z" 
    }, 
    "lastModifiedDate": { 
    "$date": "2016-06-01T10:27:04.041Z" 
    }, 
    "createdBy": "9674642375", 
    "lastModifiedBy": "9674642375" 
} 

答えて

1

この要素に複雑なマッチであるよう - $elemMatch、この場合に使用することができない、 ので、凝集フレームワークは、ヘルパーあります。

var match = { 
    $match : { 
     participants : /56d314a8e4b04d7f98cfd0c6/ 
    } 
} 
var unwind = { 
    $unwind : "$messages" 
} 
var matchSecond = { 
    $match : { 
     $or : [{ 
       "messages.touserId" : "56d314a8e4b04d7f98cfd0c6" 
      }, { 
       "messages.formuserId" : "56d314a8e4b04d7f98cfd0c6" 
      } 
     ] 
    } 
} 
var projection = { 
    $project : { 
     _id : 0, 
     messages : 1 
    } 
} 
db.deb.aggregate([match, unwind, matchSecond, projection]) 

と出力:

{ 
    "messages" : { 
     "_id" : { 
      "oid" : "574eb874027520c2158268d2" 
     }, 
     "formuserId" : "56841002eceefce22f455c7f", 
     "fromuser" : "9674642375", 
     "touserId" : "56d314a8e4b04d7f98cfd0c6", 
     "touser" : "debopam_r", 
     "message" : "Creating Discussion", 
     "isMute" : false, 
     "index" : 1.0, 
     "createDate" : { 
      "date" : "2016-06-01T10:27:00.500Z" 
     }, 
     "lastModifiedDate" : { 
      "date" : "2016-06-01T10:27:00.501Z" 
     }, 
     "createdBy" : "9674642375", 
     "lastModifiedBy" : "9674642375" 
    } 
} 
+0

応答をありがとう。しかし、Discusassionの文書の中からいくつかの要素を選択したいと思います。それは単一のクエリを使用して行うことができますか?はいの場合はどうですか? – Debopam

+0

また、メッセージ選択時にスライスを使用する方法があります – Debopam

+0

@Debopamは集約から最後の 'projection'を削除し、文書がhapされていることを確認してください。 – profesor79

関連する問題