2015-10-14 17 views
1

消息集合:MongoDB的 - 得到消息線程

{ "members": ["userA", "userB"], "content": "Some message" }, 
{ "members": ["userA", "userC"], "content": "Some message" }, 
{ "members": ["userA", "userB"], "content": "Some message 2" } 

如果我想通過userA找到消息線程,我希望這樣的結果:["UserB", "UserC"]

public function findUserThreads($user) 
    { 
     $data = $this->getCollection()->find(['members' => $user]); 
     $threads = []; 
     while($data->hasNext()){ 
      $msg = $data->getNext(); 
      if($msg['members'][0] != $user) { 
       $threads[] = $msg['members'][0]; 
      } 
      if($msg['members'][1] != $user) { 
       $threads[] = $msg['members'][1]; 
      } 
     } 

     return array_values(array_unique($threads)); 
    } 

我想這樣做在MongoDB中,不在PHP中。

+0

的期望是什麼輸出?你能更新你的問題嗎? –

+0

你是什麼意思*按用戶分組1 *你的預期結果是什麼?請使用[編輯鏈接](http://stackoverflow.com/posts/33132652/edit)來改善您的問題。 – styvane

+0

所以你想返回'userA'所在的所有用戶的數組。對? – styvane

回答

1

對此,您需要使用.aggregate()方法。

db.users.aggregate([ 
    { "$match": { "members": "userA" }}, 
    { "$project": { 
     "users": { "$setDifference": [ 
      { "$map": { 
       "input": "$members", 
       "as": "m", 
       "in": { "$cond": [ 
        { "$ne": [ "$$m", "userA" ] }, 
        "$$m", 
        false ] 
       } 
      }}, 
      [false] 
     ]} 
    }}, 
    { "$unwind": "$users" }, 
    { "$group": { 
     "_id": null, 
     "users": { "$addToSet": "$users"} 
    }} 
]) 

將返回:

{ "_id" : null, "users" : [ "userC", "userB" ] }