2016-08-12 66 views
0

我真的很想再填充骨料填入然後aggreagate在貓鼬

Comps.find().populate({ 
     path : "reviews", 
     model : "Review" 
    }).exec(function(err, populatedData){ 
     if(err) console.log(err) 
     console.log("populatedData--", populatedData) 
    }).aggregate([ 
     {$unwind : "$reviews"} 
    ]).exec(function(err, doc){ 
     if(err) throw err; 
     console.log("statements from aggregate", doc) 
    }) 

我添加了一個檢討的對象ID爲reviews陣列的譜曲集合當過用戶進行審查。現在我正在Comps中填充評論。我想在評論上做綜合的東西。

我在this question看到我不能這樣做,因爲客戶端和服務器端的東西,但我不知道如何解決它。

在鏈接中,答案基本上是將它自己的填充方法放在一起集合?當他使用$lookup

這是文檔的一個從> db.comps.find().pretty()

{ 
     "_id" : ObjectId("579706567f9c8cbc07482e65"), 
     "name" : "comp1", 
     "industry" : "industry1", 
     "anonUsers" : [ ], 
     "users" : [ ], 
     "reviews" : [ 
       "57ad8c4353ef022423dcdadb", 
       "57ad98e5cdc0ec7009530519", 
       "57ad997e51c65ab8283d9c19", 
       "57ad99f3480d0ffc141ffdf3", 
       "57ad9aafcba3fb3029b22b19", 
       "57ad9b953643bbb428034966", 
       "57ad9d022ac828040b51f824", 
       "57ad9d362bd44db8226efd47", 
       "57ad9e6f000e02082adf1110", 
       "57ad9fa3e4c8a91c20e8b805", 
       "57ada040717ddc10250b2255", 
       "57ada069e3f0f96422253364", 
       "57adf85d6312904c0ee62ae5", 
       "57adfce8b9be606007c073b1", 
       "57adff001600b53c0fe74d35" 
     ], 
     "__v" : 16 
} 

這裏是一個db.reviews.find().pretty()

{ 
     "_id" : ObjectId("57adff001600b53c0fe74d35"), 
     "updatedAt" : ISODate("2016-08-12T16:53:30.510Z"), 
     "createdAt" : ISODate("2016-08-12T16:53:20.318Z"), 
     "vote" : "up", 
     "reviewText" : "coolio again", 
     "company" : ObjectId("579706567f9c8cbc07482e65"), 
     "companyName" : "comp1", 
     "userType" : "anon", 
     "user" : ObjectId("57adfef51600b53c0fe74d34"), 
     "statements" : [ 
       { 
         "name" : "statement3", 
         "question" : "This is the question for statement3", 
         "result" : 8 
       }, 
       { 
         "name" : "statement4", 
         "question" : "This is the question for statement4", 
         "result" : 7 
       }, 
       { 
         "name" : "statement6", 
         "question" : "This is the question for statement6", 
         "result" : 6 
       } 
     ], 
     "__v" : 1, 
     "className" : "thisUser", 
     "momented" : "a few seconds ago" 
} 

編輯 我試着從鏈接這樣做。它只是給我的比賽和評論是一個ID列表。 reviews應該是一個對象數組。對象應該是來自reviews集合的評論。像人口

Comps.aggregate([ 
    {"$lookup": { 
     "from" : "Reviews", 
     "localField" : "_id", 
     "foreignField": "_id", 
     "as": "returndComp" 
    }} 
], function(err, result){ 
    if(err) throw err; 
    console.log("result", result) 
}) 
+0

你能提供一些輸入文件的例子嗎? –

+0

我給這個問題增加了一些東西。希望它有幫助 –

回答

0

作爲鏈接回答說,你不能這樣做populate()然後aggregate()但你可以certianly使用$lookup達到你所需要的。因爲reviews是一個數組,所以您需要將一個$unwind階段添加到您的管道。

在端部的額外$unwind階段是從$lookup管道弄平陣列字段。

以下示例顯示了這一點:

Comps.aggregate([ 
    { "$unwind": "$reviews" }, 
    { 
     "$lookup": { 
      "from": "Reviews", 
      "localField": "reviews", 
      "foreignField": "_id", 
      "as": "review" 
     } 
    }, 
    { "$unwind": "$review" }, 
]).exec(function(err, doc){ 
    if(err) throw err; 
    console.log("statements from aggregate", doc) 
}); 
+0

'console.log(「來自聚合的語句,doc)'給我一個空數組..''語句從聚合[]'..謝謝你的幫助。 –

+0

我已經將'$ lookup'操作符的'from'鍵的設置從''from':「reviews」,''from「改爲'」「Reviews」,'',因爲這就是您寫作的基礎集合名稱在你的'aggregate()'attempttpt中。試試看看它是如何發展的。 – chridam

+0

集合名稱是'reviews'沒有名爲'Reviews'的集合我假設您已將其更改爲該集合,因爲您在問題中看到了我的編輯。我認爲它應該是「評論」。我得到相同的空數組。 –