如何在mongodb中运行以撤消$unwind并在对象数组上运行$match

如何在mongodb中运行以撤消$unwind并在对象数组上运行$match,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在使用mongoDB Atlas为应用程序创建一个管道。 这是我目前的管道 [ { '$match': { 'serverid': 11 } }, { '$lookup': { 'from': 'runs', 'localField': 'discord_id', 'foreignField': 'advertiser',

我正在使用mongoDB Atlas为应用程序创建一个管道。 这是我目前的管道

[
    {
        '$match': {
            'serverid': 11
        }
    }, {
        '$lookup': {
            'from': 'runs', 
            'localField': 'discord_id', 
            'foreignField': 'advertiser', 
            'as': 'adRuns'
        }
    }, {
        '$lookup': {
            'from': 'runs', 
            'localField': 'discord_id', 
            'foreignField': 'boosters', 
            'as': 'boosterRuns'
        }
    }, {
        '$unwind': {
            'path': '$adRuns', 
            'includeArrayIndex': 'string', 
            'preserveNullAndEmptyArrays': False
        }
    }, {
        '$match': {
            'adRuns._id': {
                '$gte': ObjectId('5f91d6d83119c516d8e2c364')
            }
        }
    }, {
        '$match': {
            'adRuns._id': {
                '$lte': ObjectId('5f91ffffffffffffffffffff')
            }
        }
    }
}
我展开一个对象数组,以便使用十六进制ObjectId(_id)'s运行只在两个时间点之间返回对象的匹配

现在,我需要将这些对象放回一个数组中,以便为与这些运行相关联的每个用户运行$sum,我已经尝试过这样做,但无法做到

作为参考,我将为我的“用户”和“运行”集合留下一个示例文档 用户:

运行:

非常感谢你


预期的结果是再次拥有一个包含所有run对象的数组,这样我就可以用一个简单的$addField和$sum对boosterCut、advertiserCut或communityCut求和,而无需解开
adRuns
数组,您可以尝试

  • $reduce
    迭代
    adRuns
    数组的循环,在必填字段中输入空值,使用
    $add
    求和值,使用
    $mergeObjects
    将对象与当前对象合并

不需要展开
adRuns
阵列,您可以尝试

  • $reduce
    迭代
    adRuns
    数组的循环,在必填字段中输入空值,使用
    $add
    求和值,使用
    $mergeObjects
    将对象与当前对象合并

“我需要将对象放回数组中才能运行$sum…”:您可以尝试使用
$group
$sum
($sum可以在$group中使用)。尝试此操作后,group的问题是我没有签名用户。\u我想要分组的id,似乎需要哪个$group。您可以在
username
字段(或用户的唯一id字段)上分组。即使要将对象放回数组中,也需要使用
$group
(以及
$push
聚合操作符)。我不确定我是否完全理解您的评论。@JoshuaBroussard在提供的答案中是否有您认为无法解决您问题的内容?如果是,请对答案进行评论,以澄清哪些问题需要解决,哪些问题尚未解决。如果它确实回答了您提出的问题,那么请注意您提出的问题“我需要将对象放回数组中以运行$sum…”:您可以尝试使用
$group
$sum
($sum可以在$group中使用)。尝试此操作,group的问题是我没有签名用户。\我想要分组的id,$group似乎需要。您可以在
username
字段(或用户的唯一id字段)上分组。即使要将对象放回数组中,也需要使用
$group
(以及
$push
聚合操作符)。我不确定我是否完全理解您的评论。@JoshuaBroussard在提供的答案中是否有您认为无法解决您问题的内容?如果是,请对答案进行评论,以澄清哪些问题需要解决,哪些问题尚未解决。如果它确实回答了您提出的问题,那么请注意您提出的问题
{
    "_id": {
        "$oid": "5f8f1fa7b5212c7388bbae71"
    },
    "discord_id": "85479273153966080",
    "username": "Chille#9733",
    "character": "Chillelight",
    "server": "illidan",
    "serverid": 11
}
{
    "_id": {
        "$oid": "5f91d6d03119c516d8e2c365"
    },
    "advertiser": "85479273153966080",
    "adType": "legendary",
    "typeOfBoost": "mythic_plus",
    "goldAmmount": "250000",
    "server": "tichondrius",
    "serverID": 6,
    "boosters": ["85479273153966080", "131939237468700672", "85479273153966080", "131939237468700672"],
    "boosterCut": 48437.5,
    "advertiserCut": 62500,
    "communityCut": 139062.5
}
  {
    $addFields: {
      adRunsSum: {
        $reduce: {
          input: "$adRuns",
          initialValue: {
            boosterCut: 0,
            communityCut: 0,
            advertiserCut: 0
          },
          in: {
            $mergeObjects: [
              "$$value",
              {
                boosterCut: {
                  $add: ["$$this.boosterCut", "$$value.boosterCut"]
                },
                communityCut: {
                  $add: ["$$this.communityCut", "$$value.communityCut"]
                },
                advertiserCut: {
                  $add: ["$$this.advertiserCut", "$$value.advertiserCut"]
                }
              }
            ]
          }
        }
      }
    }
  }