2017-10-30 3 views
0

주어진 다음의 컬렉션 :MongoDB를 - "가입"컬렉션

메시지 수집

{ 
    "_id" : ObjectId("59f76fc3a8e87e411c22d0ac"), 
    "OriginApp" : "App1", 
    "MsgGroupId" : "499", 
    "UserName" : "User1", 
    "Message" : "Test Message [Group ID: 499]" 
} 
{ 
    "_id" : ObjectId("59f76fc3a8e87e411c22d0ad"), 
    "OriginApp" : "App1", 
    "MsgGroupId" : "499", 
    "UserName" : "User2", 
    "Message" : "Test Message [Group ID: 499]" 
} 
{ 
    "_id" : ObjectId("59f76fc3a8e87e411c22d0af"), 
    "OriginApp" : "App1", 
    "MsgGroupId" : "499", 
    "UserName" : "User3", 
    "Message" : "Test Message [Group ID: 499]" 
} 

된 MessageEvent 수집 나는 다음과 같은 투사를 반환하고 싶은

{ 
    "_id" : ObjectId("59f772d1d22ea83b249d19c2"), 
    "Event" : "Send", 
    "Msg" : { 
     "UserName" : "User1", 
     "Metadata" : { 
      "OriginApp" : "App1", 
      "MessageId" : "59f76fc3a8e87e411c22d0ac" 
     }, 
    }, 
    "TimeStamp" : "2017-10-30T18:20:17Z" 
} 
{ 
    "_id" : ObjectId("59f772d1d22ea83b249d19c2"), 
    "Event" : "Open", 
    "Msg" : { 
     "UserName" : "User1", 
     "Metadata" : { 
      "OriginApp" : "App1", 
      "MessageId" : "59f76fc3a8e87e411c22d0ac" 
     }, 
    }, 
    "TimeStamp" : "2017-10-30T18:30:16Z" 
} 
{ 
    "_id" : ObjectId("59f772d1d22ea83b249d19c2"), 
    "Event" : "Click", 
    "Msg" : { 
     "UserName" : "User1", 
     "Metadata" : { 
      "OriginApp" : "App1", 
      "MessageId" : "59f76fc3a8e87e411c22d0ac" 
     }, 
    }, 
    "TimeStamp" : "2017-10-30T18:38:57Z" 
} 

:

{ 
    "MessageId" : "59f76fc3a8e87e411c22d0ac" 
    "EventId" : "59f772d1d22ea83b249d19c2", 
    "Event" : "Send", 
    "UserName" : "User1", 
    "OriginApp" : "App1", 
    "TimeStamp" : "2017-10-30T18:20:17Z" 
} 
{ 
    "MessageId" : "59f76fc3a8e87e411c22d0ac" 
    "EventId" : "59f772d1d22ea83b249d19c2", 
    "Event" : "Open", 
    "UserName" : "User1", 
    "OriginApp" : "App1", 
    "TimeStamp" : "2017-10-30T18:30:16Z" 
} 
{ 
    "MessageId" : "59f76fc3a8e87e411c22d0ac" 
    "EventId" : "59f772d1d22ea83b249d19c2", 
    "Event" : "Click", 
    "UserName" : "User1", 
    "OriginApp" : "App1", 
    "TimeStamp" : "2017-10-30T18:38:57Z" 
} 

MsgEvent.Msg.Metadata.MessageId가 문자열이고 Message._id가 ObjectId이므로 문제가 즉시 발생했습니다. 단순한 json으로 외부 응용 프로그램에서 서비스로 반환되기 때문에 MsgEvent.Msg.Metadata.MessageId를 ObjectId로 만들 수 없습니다.

고유 한 연산자 또는 일부 유형의 집계를 사용하여 원하는 결과를 얻는 방법이 있습니까?

- UPDATE -

MongoDB를이 (원래의 질문의 일부) 쿼리의 데이터 변환, I는 추가 속성을 제공함으로써 지금 문제가 해결이 허용되지 않습니다 감안할 때

메시지 수집

{ 
    "_id" : ObjectId("59f76fc3a8e87e411c22d0ac"), 
    "GuidString" : "d273a5dd-7291-432f-a9ab-8bad7343a1a4", 
    "OriginApp" : "App1", 
    "MsgGroupId" : "499", 
    "UserName" : "User1", 
    "Message" : "Test Message [Group ID: 499]" 
} 

된 MessageEvent 수집

: 문자열로 GUID를
{ 
    "_id" : ObjectId("59f772d1d22ea83b249d19c2"), 
    "Event" : "Send", 
    "Msg" : { 
     "UserName" : "User1", 
     "Metadata" : { 
      "OriginApp" : "App1", 
      "MessageId" : "59f76fc3a8e87e411c22d0ac", 
      GuidString" : "d273a5dd-7291-432f-a9ab-8bad7343a1a4" 
     }, 
    }, 
    "TimeStamp" : "2017-10-30T18:20:17Z" 
} 

등 ...

다음 집계가 예상 결과를 반환합니다 여러 컬렉션을 결합하거나 그룹 해제, 데이터, 예를 들면 그룹의 재편을 할

db.MessageEvent.aggregate(
[ 
{ $match : { "Msg.Metadata.GuidString" : "d273a5dd-7291-432f-a9ab-8bad7343a1a4" } }, 
{ $unwind: "$Msg" }, 
{ 
    $lookup: { 
    "from": "GuidString", 
    "localField": "ChannelSenderId", 
    "foreignField": "GuidString", 
    "as": "messages" 
    } 
} 
]); 

답변

1

유일한 방법을 (긴장) 집계 프레임 워크 (권장) 또는 이전 맵 축소 프레임 워크 (덜 권장)를 사용하는 것입니다.

특히 집계하는 동안 $lookup 등 다양한 집계 단계를 선택할 수 있습니다.

데이터를 간략하게 살펴보면 ID가 MessageEvent에서 Message 객체를 가리키고 그 반대의 경우가 있으므로 Message 컬렉션 및 데이터를 Message 컬렉션에 집계해야합니다.

데이터를 재구성하는 데 도움이되는 $ project, $ group 단계가 있습니다.