2014-01-20 111 views
0

我有一個在其架構中的以下領域的產品模型對象的內部參考:解析MongoDB的總

category : { type: ObjectId, turnOn: false, ref: "category" } 

它引用中有一個標題字段類型模型:

var categorySchema = Schema({ 
    title : { type: String } 
}); 

我在MongoDB聚合中使用了product.category屬性(它是ObjectId類型,如上所示),但確實需要類別模型中的category.title屬性,而不是最終結果集中的_id。

以下代碼完成了工作,但您會看到我必須在最後執行一些循環以「解析」給定product.category(ObjectId)的標題字段。無論如何要做到所有這一切的總和?換句話說,有沒有辦法在返回的組中獲得類別模型對象的標題字段,而不必執行額外的循環工作?根據我研究過的帖子,我沒有看到內置的方式,但想要仔細檢查。

getProductsGroupedByCategory = function(callback) { 

    Category.find(function(err, cats) { 

     var aggregate = [ 
      { 
       $group: { 
        _id: "$category", 
        products: { 
         $push: { 
          title: "$title", 
          authors: "$authors", 
          publishDate: "$publishDate", 
          description: "$description" 
         } 
        } 
       } 
      }, 
      { 
       $sort: { 
        "_id": 1 
       } 
      } 
     ]; 

     Product.aggregate(aggregate, function(err, catProducts) { 
      //Grab name of category and associate with each group 
      //since we only have the category_id at this point 
      for (var i = 0; i<catProducts.length;i++) { 
       var catProduct = catProducts[i]; 
       for (var j=0;j<cats.length;j++) { 
        if (catProduct._id.toString() === cats[j]._id.toString()) { 
         catProduct.category = cats[j].title; 
        } 
       }     
      }; 
      callback(err, catProducts); 
     }); 

    }); 

}, //more code follows 

回答

0

一個示例數據會有幫助以及你需要什麼。從我理解你希望得到稱號的分組標準,這應該由具有化合物做什麼分組規則,即

_id: {category: "$category", title: "$title"} 

如果標題是一個數組內,你應該做的放鬆,組然後再次吹來達到結果。