2016-06-01 3 views
1

다음 Mongodb 문서가 있습니다. 참여자 = 'xxx'이고 (message.touserid = 'xxx'또는 message.fromuserid = 'xxx') 문서를 가져오고 싶습니다.몽고 쿼리 선택 임베디드 문서

다음 쿼리를 사용하고 있지만 모든 메시지가 하나 대신 반환됩니다. 이 결과를 얻는 방법을 알려주십시오.

{ 
    "_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

이 요소에 복잡한 경기이기 때문에

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

- $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

감사합니다. 그러나 Discuassion 문서에서 일부 요소를 선택하고 싶습니다. 단일 쿼리를 사용하여 수행 할 수 있습니까? 그렇다면 어떻게? – Debopam

+0

또한 메시지 선택시 슬라이스를 사용하는 방법이 있습니다 – Debopam

+0

@Debopam은 집계에서 마지막 '투영'을 제거하고 문서가 haped되었음을 알 수 있습니다. – profesor79