首页 文章

解析MongoDB聚合中的ref

提问于
浏览
0

我有一个Product模型对象,其模式中包含以下字段:

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

它引用了一个包含 Headers 字段的类别模型:

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

我在MongoDB聚合中使用了product.category属性(类型为ObjectId,如上所示),但实际上需要类别模型中的category.title属性而不是最终结果集中的_id .

下面的代码完成了工作,但是你会发现我必须在最后做一些循环来“解析”给定product.category(ObjectId)的title字段 . 无论如何都要在聚合中做所有这些?换句话说,有没有办法在返回的组中获取类别模型对象的 Headers 字段,而不是必须进行额外的循环工作?基于我研究过的帖子,我没有看到内置的方式,但想要仔细检查 .

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

1 回答

  • 0

    一个示例数据将有助于您需要它 . 根据我的理解,您希望获得分组标准的 Headers ,并且应该通过具有复合分组标准来进行,即

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

    如果 Headers 在一个数组中,你应该放松,分组,然后再次风,以达到结果 .

相关问题