2016-02-20 83 views
0

一個foreignField我打我的頭在桌子上太久這一個...

我有兩個MongoDB的集合:「聊天室」和「用戶」。 「聊天室」集合具有指向「用戶」集合中特定單個用戶的「user_id」鍵。

我試圖與使用$查找彙總查詢用戶獲取的聊天室,我目前擁有的是這一個:

$this->mongo->chatroom->aggregate(
    array('$lookup' => array(
     'from' => 'users', 
     'localField' => 'user_id', 
     'foreignField' => '_id', 
     'as' => 'user' 
    )) 
); 

然而,這個返回集合中的一個空的「用戶」字段。奇怪的是,如果我試圖取代「_id」自定義「UID」設置爲_id價值$ ID,它按預期工作:

$this->mongo->chatroom->aggregate(
    array('$lookup' => array(
     'from' => 'users', 
     'localField' => 'user_id', 
     'foreignField' => 'uid', // uid = _id.$id 
     'as' => 'user' 
    )) 
); 

我想通了,問題是,「_id 「是ObjectId,而」user_id「是一個字符串。但我不知道如何處理這個問題很好......

回答

0

爲了回答我自己的問題,我通過將「user_id」作爲「MongoId」類的實例而不是普通字符串來解決問題。基本上,我店「user_ID的」爲:

$mongoObject["user_id"] = new MongoId($this->user_id); 

另一種解決方案可能會被用等於「 _id $ ID」的值與裝飾「UID」字段的對象。

+1

它實際上不是*「繞着問題」(原文如此)*,而是「糾正」問題。就像發佈任何**查詢一樣,數據必須是相同的「類型」以匹配。所以''localField''和''ForeignField''必須都具有相同的BSON類型,否則隨後的「查詢」失敗。就好像你試圖用'_id'作爲字符串查詢你的'users'集合而不是重新轉換,那麼這個查詢就不會返回結果。沒有區別,並通過設計。 –

+0

是的,我得到這一點,並認同這是一個正確的行爲 - 只是有點困惑,因爲我找不到任何方式來進行轉換聚合查詢和可視化工具沒有告訴我的類型(只是顯示值作爲串)。 –

+1

您不能對所有類型進行聚合(有一些有趣的例外,但這是一般規則),或者至少不能用於「ObjectId」。正確的做法是將兩種類型切換成相同的,以確保它們「匹配」。還總是使用'mongo' shell來檢查數據。它可能缺乏「花裏胡哨」,但它是「保證」向您展示正確類型的一件事。這是一個官方產品,所以應該是預期的。接受你自己的答案。這是正確的方法。 –