解析MongoDB聚合中的ref

解析MongoDB聚合中的ref,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个产品模型对象,其架构中有以下字段: category : { type: ObjectId, turnOn: false, ref: "category" } 它引用的类别模型中包含标题字段: var categorySchema = Schema({ title : { type: String } }); 我在MongoDB聚合中使用product.category属性(类型为如上所示的ObjectId),但我确实希望category模型中的category.titl

我有一个产品模型对象,其架构中有以下字段:

category : { type: ObjectId, turnOn: false, ref: "category" }
它引用的类别模型中包含标题字段:

var categorySchema = Schema({
    title   : { type: String }
});
我在MongoDB聚合中使用product.category属性(类型为如上所示的ObjectId),但我确实希望category模型中的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
getProductsGroupedByCategory=函数(回调){
Category.find(函数(err,cats){
var聚合=[
{
$group:{
_id:“$category”,
产品:{
$push:{
标题:“$title”,
作者:“$authors”,
publishDate:“$publishDate”,
说明:“$description”
} 
}
}
},
{ 
$sort:{
“_id”:1
}
}
];
聚合(聚合,函数(err,catProducts){
//获取类别名称并与每个组关联
//因为我们现在只有类别id

对于(var i=0;i示例数据以及您需要的数据将很有帮助。据我所知,您希望将标题添加到分组标准中,这应该通过使用复合分组标准来实现,即

_id: {category: "$category", title: "$title"}
如果标题在一个数组中,则应进行展开、分组,然后再次缠绕以获得结果