【问题标题】:How to prevent duplicate sum after lookup and unwind mongodb查找和展开mongodb后如何防止重复总和
【发布时间】:2019-05-21 14:06:41
【问题描述】:

我有收集torder(销售、客户、小计和发票的集合)和tsales(销售信息的集合,它有1个或多个联系人),然后我想检查每个客户在当前期间的总订单数,这是我放 $unwind 之前的代码:

db.torder.aggregate([
        {$match:{$and:[{TANGGALPI:{$gte:'2019-01-01'}},{TANGGALPI:{$lte:'2019-12-31'}}]}},
        {$lookup:{
                from:"tsales",
                localField:"IDSALES",
                foreignField:"SALESCODE",
                as:"SALESINFO"
        }},
        {$group:{
                _id:"$CUSTNAME",SALES:{$first:"$SALESINFO.NAMASALES"},TOTAL : { $sum: {$multiply:["$QTY","$PRICE"]}}}},
        {$sort:{TOTAL:-1}}
])

它会返回这样的输出:

[{"_id":"CUSTOMER ABC","SALES":(Array) 2 Elements,"TOTAL":231986}]

然后我做$unwind,将数组元素更改为字段元素:

db.torder.aggregate([
        {$match:{$and:[{TANGGALPI:{$gte:'2019-01-01'}},{TANGGALPI:{$lte:'2019-12-31'}}]}},
        {$lookup:{
                from:"tsales",
                localField:"IDSALES",
                foreignField:"SALESCODE",
                as:"SALESINFO"
        }},
        {$unwind : "$SALESINFO"},
        {$group:{
                _id:"$CUSTNAME",SALES:{$first:"$SALESINFO.NAMASALES"},TOTAL : { $sum: {$multiply:["$QTY","$PRICE"]}}}},
        {$sort:{TOTAL:-1}}
])

它的输出变成:

[{"_id":"CUSTOMER ABC","SALES":"Peter","TOTAL":463972}] => total will become 2 times than before

我检查了我的 tsales 集合,Sales Peter 有两行值,所以使总和值重复,如何使用 $unwind 对单行 tsales 集合进行正确的计算总和

我想要这样的输出:

[{"_id":"CUSTOMER ABC","SALES":"Peter","TOTAL":231986}]

【问题讨论】:

    标签: mongodb sum mongodb-query aggregation-framework


    【解决方案1】:

    您只需要交换$group$lookup 阶段。

    db.torder.aggregate([
      { "$match": {
        "TANGGALPI": { "$gte": "2019-01-01", "$lte": "2019-12-31" }
      }},
      { "$group": {
        "_id": "$CUSTNAME",
        "IDSALES": { "$first": "$IDSALES" },
        "TOTAL": { "$sum": { "$multiply": ["$QTY", "$PRICE"] } },
        "duplicateNames": { "$push": "$name" }
      }},
      { "$lookup": {
        "from": "tsales",
        "localField": "IDSALES",
        "foreignField": "SALESCODE",
        "as": "SALES"
      }},
      { "$addFields": {
        "SALES": { "$arrayElemAt": ["$SALES.NAMASALES", 0] }
      }},
      { "$sort": { "TOTAL": -1 } }
    ])
    

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多