首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb中的$unwind、$aggregation操作

mongodb中的$unwind、$aggregation操作
EN

Stack Overflow用户
提问于 2020-02-25 16:16:33
回答 1查看 54关注 0票数 1

请检查此查询

代码语言:javascript
复制
   db.billsummaryofthedays.aggregate([
    {
        '$match': {
            'userId': ObjectId('5e43de778b57693cd46859eb'),
            'adminId': ObjectId('5e43e5cdc11f750864f46820'),
            'date': ISODate("2020-02-11T16:30:00Z"),
        }
    },
         {
           $lookup:
           {
               from: "paymentreceivables",
               let: { userId: '$userId', adminId: '$adminId' },
               pipeline: [
                   {
                       $match:
                       {
                        paymentReceivedOnDate:ISODate("2020-02-11T16:30:00Z"),
                           $expr:
                           {
                               $and:
                                   [
                                       { $eq: ["$userId", "$$userId"] },
                                       { $eq: ["$adminId", "$$adminId"] }
                                   ]
                           }
                       }
                   },
                   { $project: { amount: 1, _id: 0 } }
               ],
               as: "totalPayment"         
           }
       }, {'$unwind':'$totalPayment'},
       {   $group:
        { _id:
           { date: '$date',
           userId: '$userId',
            adminId: '$adminId' },
          totalBill:
             {
                  $sum: '$billOfTheDay'    
           },
             totalPayment:
             {
                  $sum: '$totalPayment.amount'
           }
       }
   },
       }
   }])

,这是我在shell中得到的结果

代码语言:javascript
复制
   {
    "_id" : {
            "date" : ISODate("2020-02-11T18:30:00Z"),
            "userId" : ObjectId("5e43de778b57693cd46859eb"),
            "adminId" : ObjectId("5e43e5cdc11f750864f46820")
    },
    "totalBill" : 1595.6799999999998,
    "totalPayments" : 100
   }

现在,这不是我所期望的,我想,由于{'$unwind':'$totalPayment'},它从数组中取出所有的值,因为每个文档都被计算了2次。当我移除{'$unwind':'$totalPayment'}时,totalBill和被证明是正确的,但是totalPayment是0。我尝试过其他几种方法,但无法达到预期的结果,以下是我的收藏:

代码语言:javascript
复制
    // collection:billsummaryofthedays//
      {
        "_id" : ObjectId("5e54f784f4032c1694535c0e"),
        "userId" : ObjectId("5e43de778b57693cd46859eb"),
        "adminId" : ObjectId("5e43e5cdc11f750864f46820"),
        "date" : ISODate("2020-02-11T16:30:00Z"),
        "UID":"acex01"
        "billOfTheDay" : 468,
     }
     {
        "_id" : ObjectId("5e54f784f4032c1694535c0f"),
         "UID":"bdex02"
        "userId" : ObjectId("5e43de778b57693cd46859eb"),
        "adminId" : ObjectId("5e43e5cdc11f750864f46820"),
        "date" : ISODate("2020-02-11T16:30:00Z"),
         "billOfTheDay" : 329.84,
       }
    // collection:paymentreceivables//
     {
        "_id" : ObjectId("5e43e73169fe1e3fc07eb7c5"),
        "paymentReceivedOnDate" : ISODate("2020-02-11T16:30:00Z"),
        "adminId" : ObjectId("5e43e5cdc11f750864f46820"),
        "userId" : ObjectId("5e43de778b57693cd46859eb"),
        "amount" : 20,
       }
      {
        "_id" : ObjectId("5e43e73b69fe1e3fc07eb7c6"),
        "paymentReceivedOnDate" : ISODate("2020-02-11T16:30:00Z"),
        "adminId" : ObjectId("5e43e5cdc11f750864f46820"),
        "userId" : ObjectId("5e43de778b57693cd46859eb"),
        "amount" : 30,
       }

希望得到的结果应该是totalBill:797.83 totalPayment:50 i.e468+329.84,和totalPayment:50 i.e30+20,,但我得到的是预期结果的两倍,即使我能够正确地计算其中一个值,另一个结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-25 17:57:04

由于billsummaryofthedays集合中有多个具有相同数据的文档,所以可以首先分组&然后执行$lookup --这样,两个集合之间的连接将是1-Vs-many而不是当前编写的many-Vs-many,因此您可以尝试下面的查询以获得所需的o/p和性能增益:

代码语言:javascript
复制
db.billsummaryofthedays.aggregate([
  {
    "$match": {
      "userId": ObjectId("5e43de778b57693cd46859eb"),
      "adminId": ObjectId("5e43e5cdc11f750864f46820"),
      "date": ISODate("2020-02-11T16:30:00Z"),

    }
  },
  {
    $group: {
      _id: {
        date: "$date",
        userId: "$userId",
        adminId: "$adminId"
      },
      totalBill: {
        $sum: "$billOfTheDay"
      }
    }
  },
  {
    $lookup: {
      from: "paymentreceivables",
      let: {
        userId: "$_id.userId",
        adminId: "$_id.adminId"
      },
      pipeline: [
        {
          $match: {
            paymentReceivedOnDate: ISODate("2020-02-11T16:30:00Z"),
            $expr: {
              $and: [
                {
                  $eq: [
                    "$userId",
                    "$$userId"
                  ]
                },
                {
                  $eq: [
                    "$adminId",
                    "$$adminId"
                  ]
                }
              ]
            }
          }
        },
        {
          $project: {
            amount: 1,
            _id: 0
          }
        }
      ],
      as: "totalPayment"
    }
  },
  {
    $addFields: {
      totalPayment: {
        $reduce: {
          input: "$totalPayment",
          initialValue: 0,
          in: {
            $add: [
              "$$value",
              "$$this.amount"
            ]
          }
        }
      }
    }
  }
])

测试: MongoDB-游乐场

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60398956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档