2013-07-13 248 views
0

我有一個在MongoDB中的'報告'集合。該集合包含報告所屬用戶的ObjectId。我目前正在進行彙總,以便我可以按用戶分組報告。Mongodb聚合'加入'

db.reports.aggregate(
    { 
     $group: { 
      _id: "$user", 
      stuff: { 
       $push: { 
        things: { 
         properties: "$properties" 
        } 
       } 
      } 
     } 
    }, 
    { 
     $project: { 
      _id: 0, 
      user: "$_id", 
      stuff: "$stuff" 
     } 
    } 
) 

這給了我一個用戶id和報告'東西'的數組。而不是隻是userId我想知道如果我可以形成聚合,而不是隻是userId我可以擊中用戶集合並返回有關該用戶的更多信息。

這可能嗎?我使用貓鼬作爲ORM,但是看着貓鼬的文檔,聚合看起來是對mongodb聚合函數的直接傳遞。不要以爲我可以利用貓鼬的填充,因爲聚合不處理模式,但我可能是錯的。

最後報告是計算機生成的,每個用戶可能有數百萬。這使我無法將報告存儲在包含用戶集合的數組中。

回答

2

不,你不能這樣做,在MongoDB中,因爲沒有連接(不正常的查詢,MapReduce的,或聚合框架)。

只能從聚合函數中訪問一個集合。

Mongoose不會直接幫助,或者必須對其他用戶信息進行查詢,而不是一次對大量用戶執行$inuserId的數組)。 ($in docs here

真的沒有解決方法,因爲缺少連接目前是MongoDB的有意設計(即它是如何工作的)。您可能會考慮兩條路徑:

  1. 您可能會發現另一個數據庫平臺將更適合您嘗試運行的查詢類型。
  2. 在將聚合結果返回給客戶端代碼(這是Mongoose處理提取相關文檔的方式之一)之後,您可以按照上述建議使用$in。只需抓住userIds,並批量請求相關的用戶文檔。雖然它的網絡流量更多一些,但取決於您希望如何顯示結果,您可能會認爲這是一種優化,只需向用戶顯示額外的用戶信息(如果可能的話),即通過逐步加載額外的數據來獲取。
+0

請更新您的答案,包括$ lookup,這是連接的mongodb方式 – PirateApp

0

你可以在兩個集合合併成一個,並做彙總正是如此。您不需要在集合中具有相同的結構化頂級文檔。它不會是太困難,以紀念A型或B的每個文檔和適應你的涉及類型文檔的查詢,包括如果該文件是A型

你可能不喜歡它的外觀,但會爲您建立的「加入」。