使用 mongodb 获得条件总和

Posted

技术标签:

【中文标题】使用 mongodb 获得条件总和【英文标题】:get sum conditional with mongodb 【发布时间】:2018-10-18 09:04:53 【问题描述】:

我需要通过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']  

【问题讨论】:

不知道你在说什么。 MongoDB 集合不是数组。在帮助中心查看How to Ask 并查看其他人提出的一些问题。 【参考方案1】:

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
        
    
]);

【讨论】:

嗨@pedro-goes 谢谢,它有效我有其他问题,用这种方法告诉我是否存在销售,但如果我想查看所有类别,销售或不销售,你知道吗? 嘿@fernando,为此,您需要更改.aggregate 的顺序。您将希望主要在“类别”集合(因此它获取所有类别)或“产品”集合(因此它获取所有产品)而不是“销售”集合上运行它。从这一点开始,您将 $lookup 直到达到销售量,然后进行分组等。它可能需要一些调整,但这是路径。当我找到一台工作的电脑并更新我的答案时,我会修改一个例子。 我不能,我会等你的更新,谢谢 再次感谢您,但仍然只显示一个类别而不是所有类别,目前显示已分配销售的类别 我用您的数据对此进行了测试,只是将第二次销售(价值为 90 的那个)更改为 productId: 1 并且工作正常。向我展示了类别:2,值为 0。它返回:“_id”:2,“total”:0,“name”:“cat2” “_id”:1,“total”:170,“name”:“cat1”

以上是关于使用 mongodb 获得条件总和的主要内容,如果未能解决你的问题,请参考以下文章

如何获得总和的总和和总和,这也是mongoDB中项目的总和

有没有办法在 MongoDB 中获取具有 WHERE (SQL) 等条件的字段总和

如何使用 mongoDB 条件查询在 java 中获得更干净的代码 [重复]

如何获得满足 mongodb 中字段所有条件的用户?

如何在mongodb的单个查询中添加具有不同条件输出的Multiple Group By?

MongoDB 聚合:从先前行的总和计算运行总计