【问题标题】:How to run to undo an $unwind in mongodb and running a $match on an array of objects如何运行以撤消 mongodb 中的 $unwind 并在对象数组上运行 $match
【发布时间】:2021-02-07 04:28:04
【问题描述】:

我正在使用 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) 的两个时间点之间返回对象的匹配

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

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

{
    "_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
}

非常感谢!

预期的结果是再次拥有所有运行对象的数组,以便我可以用简单的 $addField 和 $sum 对 boosterCut、advertisingrCut 或 communityCut​​ 求和

【问题讨论】:

  • “我需要将对象放回数组中才能运行 $sum...”:您可以尝试使用 $group$sum ($sum 可以在 $group 中使用)。
  • 试过了,group的问题是我没有想要分组的sign user._id,$group似乎需要这个。
  • 您可以在username 字段(或用户的唯一ID 字段)上进行分组。即使要将对象放回数组中,您也需要使用$group(以及$push 聚合运算符)。我不确定我是否完全理解您的评论。
  • @JoshuaBroussard 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,请对答案发表评论,以澄清究竟需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题

标签: mongodb mongodb-query


【解决方案1】:

不需要解压adRuns数组你可以试试,

  • $reduce 迭代 adRuns 数组的循环,在必填字段中输入空值,使用 $add 求和并使用 $mergeObjects 将对象与当前合并
  {
    $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"]
                }
              }
            ]
          }
        }
      }
    }
  }

Playground

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 2019-05-30
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多