mongodb节点中的$unwind$聚合操作

mongodb节点中的$unwind$聚合操作,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,请检查此查询 db.billsummaryofthedays.aggregate([ { '$match': { 'userId': ObjectId('5e43de778b57693cd46859eb'), 'adminId': ObjectId('5e43e5cdc11f750864f46820'), 'date': ISODate("2020-02-11T16:30:00Z"),

请检查此查询

   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'
           }
       }
   },
       }
   }])
这是我在壳中得到的结果

   {
    "_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。 我尝试过其他几种方法,但没有达到预期的效果 以下是我的收藏:

    // 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
即[468+329.84]和
totalPayment:50
即[30+20,]
但我得到的结果是期望结果的两倍,即使我能够正确计算其中一个值,另一个结果也是0。如何解决这个问题

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

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"
            ]
          }
        }
      }
    }
  }
])

测试:

@-whoami是的,它解决了问题感谢您的帮助,很抱歉您知道的响应太晚工作和业务需求-:)