2017-06-22 36 views
0

所以這裏是我的嘗試它沒有工作,我不知道我需要做什麼,文檔解釋這只是坦白。mongodb加入兩個集合獲取數據

所以我希望有人在這裏知道如何做到這一點。

基本的概念:我已經存儲了用戶的主配置文件集合

成員集合

{ 
    "_id" : ObjectId("aaaat656a464"), 
    "email" : "[email protected]", 
    "personal" : { 
     "name" : { 
      "firstname" : "Russell", 
      "lastname" : "Harrower" 
     }, 
     "profile_id" : ObjectId("333a0e2b7acebe9b869b1b0a") 
    }, 
    "kst" : ObjectId("111111111111g") 
} 

現在我想從members_media集合PROFILE_ID在用戶的最新資料圖片ID其中_id = PROFILE_ID

這是members_media收集

{ 
    "_id" : ObjectId("333a0e2b7acebe9b869b1b0a"), 
    "data" : { 
     "url" : "https://scontent.xx.fbcdn.net/v/t1.0-1/11659354_1625058617782022_7822649569017662262_n.jpg?oh=6e2b74b33c1c4ea4cdc0094a1ae35e14&oe=59DF809A", 
     "type" : "facebook/image", 
     "date" : ISODate("2017-06-21T06:16:18.580Z"), 
     "profile_pic" : true 
    }, 
    "uid" : ObjectId("111111111111g") 
} 

因此,這裏是我的嘗試

$check = $db->aggregate([ 
         ['$unwind'=> "$members_media"], 
         ['$unwind' => ['path'=>"$members_media", 'includeArrayIndex'=>"arrayIndex"]], 
         ['$lookup'=> 
          [ 
           'from'=>"members_media", 
           'localField'=>"personal.profile_id", 
           'foreignField'=>"_id", 
           'as'=>"profilepic" 
          ] 
         ] 



       ]); 

然而,當我運行下面的它不會成員集合

$db = static::db()->members; 
    /*$check = $db->findOne(['kst' => New MongoDB\BSON\ObjectId($_SESSION["ipet_user"]), 'personal'=>['$exists'=>true]], 
         ['personal.profile_id' => 1] 
    );*/ 

    $check = $db->aggregate([ 
        ['$lookup' => 


    [ 
         'from'=>"members_media", 
         'localField'=>"members.personal.profile_id", 
         'foreignField'=>"_id", 
         'as'=>"data" 
        ] 
       ], 
       ['$match' => 
        ['members.kst' => New MongoDB\BSON\ObjectId($_SESSION["user"]), 'members.personal'=>['$exists'=>true]] 
       ], 
       ['$unwind' => ['path' => '$members_media.data', 'includeArrayIndex' => 'arrayIndex']], 
       ['$project' => 
        ['members.profile_path'=>'$data.url'] 
       ] 

     ]); 

我的結果是

object(MongoDB\Driver\Cursor)#19 (9) { ["database"]=> string(4) "ipet" ["collection"]=> NULL ["query"]=> NULL ["command"]=> object(MongoDB\Driver\Command)#18 (1) 
+0

你是假的關於收集名稱?你有沒有嘗試在shell中運行?因爲我認爲你應該。這很令人困惑,因爲你有兩次嘗試做兩件不同的事情。 '$ unwind'語句在聚合管道的頂部肯定沒有位置。第二看起來最接近可行。但是你真的應該分階段進行測試,並且如果你有正確的集合名稱,至少有一些想法。現在,它看起來沒有說服你已經徹底測試過。請告訴我們更多。 –

回答

0

我們可以這樣做

$resultData = $db->collectionName->aggregate([ 

        ['$lookup' => [ 
         'from' => 'members_media', 
         'localField' => 'personal.profile_id', 
         'foreignField' => '_id', 
         'as' => 'profileDetail', 
        ]]]); 

$myData = array(); 

    foreach($resultData as $result) { 
     //var_dump($result); 
     array_push($myData, $result); 
    } 
    print_r($myData);