1

다음과 같은 메시지가 있습니다. 이제는 ObjectId ("57f55e4799aabf1c0565bc10") 메시지를 수신하거나 자체 메시지 (ObjectId ("57f55e4799aabf1c0565bc10"))를 제외한 모든 고유 사용자를 얻고 싶습니다. 그래서 어떻게 집계를 사용하여 달성 할 수 있습니다.mongodb aggregation을 통해 모든 다른 사용자를 얻으십시오.

/* 1 */ 
{ 
    "_id" : ObjectId("57f55e0199aabf1c0565bc0e"), 
    "message" : "fghjfghj", 
    "to" : ObjectId("57f54e154df8d0193577889a"), 
    "from" : ObjectId("57f5522099aabf1c0565bbfe"), 
    "modifiedDate" : ISODate("2016-10-05T20:09:37.307Z"), 
    "createdDate" : ISODate("2016-10-05T20:09:37.307Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("57f55e2d99aabf1c0565bc0f"), 
    "message" : "ghjkfhkg", 
    "to" : ObjectId("57f54e154df8d0193577889a"), 
    "from" : ObjectId("57f5522099aabf1c0565bbfe"), 
    "modifiedDate" : ISODate("2016-10-05T20:10:21.245Z"), 
    "createdDate" : ISODate("2016-10-05T20:10:21.245Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("57f55e4799aabf1c0565bc10"), 
    "message" : "hgkgh", 
    "to" : ObjectId("57f54e154df8d0193577889a"), 
    "from" : ObjectId("57f5522099aabf1c0565bbfe"), 
    "modifiedDate" : ISODate("2016-10-05T20:10:47.614Z"), 
    "createdDate" : ISODate("2016-10-05T20:10:47.614Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("57f55e7199aabf1c0565bc11"), 
    "message" : "cbjngcfj", 
    "to" : ObjectId("57f54e154df8d0193577889a"), 
    "from" : ObjectId("57f5522099aabf1c0565bbfe"), 
    "modifiedDate" : ISODate("2016-10-05T20:11:29.197Z"), 
    "createdDate" : ISODate("2016-10-05T20:11:29.197Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 5 */ 
{ 
    "_id" : ObjectId("57f5801d94ef64d760275368"), 
    "message" : "cbjngcfj", 
    "from" : ObjectId("57f54e154df8d0193577889a"), 
    "to" : ObjectId("57f5522099aabf1c0565bbfe"), 
    "modifiedDate" : ISODate("2016-10-05T20:11:29.197Z"), 
    "createdDate" : ISODate("2016-10-05T20:11:29.197Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 6 */ 
{ 
    "_id" : ObjectId("57f5865494ef64d76027536a"), 
    "message" : "hgkgh", 
    "to" : ObjectId("57f54e154df8d0193577889b"), 
    "from" : ObjectId("57f5522099aabf1c0565bbfe"), 
    "modifiedDate" : ISODate("2016-10-05T20:10:47.614Z"), 
    "createdDate" : ISODate("2016-10-05T20:10:47.614Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 7 */ 
{ 
    "_id" : ObjectId("57f666de7d13f10b5aa53527"), 
    "message" : "Zsdfsdf", 
    "to" : ObjectId("57f54dd36df11022ac5d7769"), 
    "from" : ObjectId("57f54dd36df11022ac5d7769"), 
    "modifiedDate" : ISODate("2016-10-06T14:59:42.943Z"), 
    "createdDate" : ISODate("2016-10-06T14:59:42.943Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 8 */ 
{ 
    "_id" : ObjectId("57f667397d13f10b5aa53528"), 
    "message" : "HIIIIIIIIIIIII", 
    "to" : ObjectId("57f54dd36df11022ac5d7769"), 
    "from" : ObjectId("57f54dd36df11022ac5d7769"), 
    "modifiedDate" : ISODate("2016-10-06T15:01:13.993Z"), 
    "createdDate" : ISODate("2016-10-06T15:01:13.993Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

/* 9 */ 
{ 
    "_id" : ObjectId("57f66972a533c40d67ebfab8"), 
    "message" : "gfjghk", 
    "to" : ObjectId("57f54e154df8d0193577889a"), 
    "from" : ObjectId("57f5522099aabf1c0565bbfe"), 
    "modifiedDate" : ISODate("2016-10-06T15:10:42.721Z"), 
    "createdDate" : ISODate("2016-10-06T15:10:42.721Z"), 
    "isDeleted" : false, 
    "status" : true, 
    "type" : "Message", 
    "__v" : 0 
} 

나는 시도했지만 다음과 같이 필요한 결과를 얻을 수하지 않았다 않은 :

db.getCollection('conversations').aggregate([ 
      {$match : {'type' : 'Message', 
        $or : [ 
          {from : ObjectId("57f5522099aabf1c0565bbfe")}, 
          {to : ObjectId("57f5522099aabf1c0565bbfe")} 
         ] 
         } 
      }, 
      { $group: {_id : {"to" : "$to", 'from':"$from" }}}, 

]); 

기대 결과처럼 - 어떤 제안에 대한

[ 
    ObjectId("57f54e154df8d0193577889a") 
    ObjectId("57f54e154df8d0193577889b") 
] 

감사합니다.

답변

1

$addToSet을 사용하여 발신자와 수신자를 각각의 세트 (목록)에 추가 할 수 있습니다. 그런 다음 $setUnion을 사용하여 세트를 결합 할 수 있습니다. 그런 다음 $setDifference을 사용하여 현재 사용자를 제거 할 수 있습니다.

db.getCollection('conversations').aggregate([ 
    {$match : {'type' : 'Message',$or : [ {from : ObjectId("57f5522099aabf1c0565bbfe")}, 
              {to : ObjectId("57f5522099aabf1c0565bbfe")}]}},  
    { $group: {_id : null, from : {"$addToSet" : "$from"}, to : {"$addToSet" : "$to"}}}, 
    {"$project":{"userAll":{"$setUnion":["$from", "$to"]}}}, 
    {"$project":{"_id":0, users: {"$setDifference":["$userAll", [ObjectId("57f5522099aabf1c0565bbfe")]]}}} 
]); 

샘플 출력 :

{ 
     "users" : [ 
       ObjectId("57f54e154df8d0193577889b"), 
       ObjectId("57f54e154df8d0193577889a") 
     ] 
} 
+1

감사합니다, 그것은 일했다. 또한, 솔루션을 찾을 수도 있지만 성능을 비교할 때 귀하의 쿼리가 나보다 훨씬 더 최적화 된 것으로 나타났습니다. 너무 커서 +. 감사 – rroxysam