得到与mongodb有条件的和

时间:2018-05-08 12:03:35

标签: arrays mongodb mongoose

我需要获得销售总额,只需idCategory,任何想法? 我在mongondb中有这3个模式

category = [{"id":1,"name":"cat1"}, {"id":2,"name":"cat2"}]
product  = [{"id":1,"name":"product1", "catId":1}, {"id":2,"name":"product2", "catId":2}]
sells    = [{"id":1,"value":80, "productId":1, status:'active'},  {"id":2,"value":90, "productId":2, status:'Inactive'}]  

1 个答案:

答案 0 :(得分:0)

MongoDB集合不是实际的模式,我也假设:

  • 您将它们解释为数组(尽管它们不是),因此您的意思是每个集合中都有2个文档。

  • 您想要按产品类别分组的销售总额。

如果是这些情况,您想要的是MongoDB Aggregate,您可以在“sells”集合上运行,“join”与“product”集合以及按类别ID分组。

这样做的基础聚合将沿着以下几行:

sells.aggregate([
    {
        $lookup: {
            from: "product",
            localField: "productId",
            foreignField: "id",
            as: "ProductData"
        }
    },
    {
        $unwind: "$ProductData"
    },
    {
        $group: {
            _id: "$ProductData.catId",
            total: { $sum: "$value" }
        }
    }
]);

如果您还希望在聚合后获取类别名称,您需要做的就是在加入类别集合的管道末尾插入另一个$ lookup:

sells.aggregate([
    {
        $lookup: {
            from: "product",
            localField: "productId",
            foreignField: "id",
            as: "ProductData"
        }
    },
    {
        $unwind: "$ProductData"
    },
    {
        $group: {
            _id: "$ProductData.catId",
            total: { $sum: "$value" }
        }
    },
    {
        $lookup: {
            from: "category",
            localField: "_id",
            foreignField: "id",
            as: "CategoryData"
        }
    },
    { 
        $unwind: "$CategoryData"
    },
    {
        $project: {
            name: "$CategoryData.name",
            total: 1
        }
    }
]);

编辑(在评论中添加新案例请求):

db.getCollection('product').aggregate([
    {
        $lookup: {
            from: "sells",
            localField: "id",
            foreignField: "productId",
            as: "SalesData"
        }
    },
    {
        $unwind:
        {
            path: "$SalesData",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $project: {
            catId: 1,
            value: "$SalesData.value"
        }
    },
    {
        $group: {
            _id: "$catId",
            total: { $sum: "$value" }
        }
    },
    {
        $lookup: {
            from: "category",
            localField: "_id",
            foreignField: "id",
            as: "CategoryData"
        }
    },
    { 
        $unwind: "$CategoryData"
    },
    {
        $project: {
            name: "$CategoryData.name",
            total: 1
        }
    }
]);