【问题标题】:Count of equal elements in array across multiple documents in mongodbmongodb 中跨多个文档的数组中相等元素的计数
【发布时间】:2023-02-07 03:51:57
【问题描述】:

我正在开发一个简单的程序,通过 n 个玩家来计算特殊单位的总数。

我有类似于此(简化)的文档,其中数组 rosterUnits 的长度可以是 0 到 7。总共有 7 个特殊单元。我需要知道每个单位球员中有多少人在花名册中。

{
  {
    _id: ObjectId(...),
    member: {
      rosterUnits: [ "Unit1", "Unit2", "Unit3", "Unit4"]
    }
  },
  {
    _id: ObjectId(...),
    member: {
      rosterUnits: [ "Unit1", "Unit3"]
    }
  },
  ...
}

预期结果将是这样的:

{
  _id: ...
  result: [
    {
      name: "Unit1"
      count: 2
    },
    {
      name: "Unit2"
      count: 1
    },
    {
      name: "Unit3"
      count: 2
    },
    ...
    {
      name: "Unit7"
      count: 0
    }
  ]
}

如何使用聚合管道实现此目的?

【问题讨论】:

  • 你试过什么?这似乎是 $group 最常见和最基本的用例

标签: arrays mongodb aggregation-framework


【解决方案1】:
  • 使用$unwindrosterUnits 数组解构为单独的文档。
  • 然后使用$grouprosterUnits 值对文档进行分组并计算每个单元的计数。
  • 然后使用$project 将输出格式化为仅包含名称和计数字段。
db.collection.aggregate([
    { 
        $unwind: "$member.rosterUnits" 
    },
    { 
        $group: { 
            _id: "$member.rosterUnits", 
            count: { $sum: 1 } 
        } 
    },
    { 
        $project: { 
            _id: 0, 
            name: "$_id", 
            count: "$count" 
        } 
    }
])

【讨论】:

    【解决方案2】:

    是的,我认为最好的方法是使用聚合。

    我相信有更好的方法来做到这一点。 但这是解决方案,我希望它对你朋友有用。

    基本上,我们将使用“$group”聚合,并在其中使用运算符“$cond”和“$in”,如果找到搜索到的元素,我们将逐个验证。如果是这样,我们将加一,如果未找到该元素,则加零。

    我建议你下载 mongodb compass 试试

    聚合:

        [{
         $group: {
          _id: null,
          Unit1: {
           $sum: {
            $cond: [
             {
              $in: [
               'Unit1',
               '$member.rosterUnits'
              ]
             },
             1,
             0
            ]
           }
          },
          Unit2: {
           $sum: {
            $cond: [
             {
              $in: [
               'Unit2',
               '$member.rosterUnits'
              ]
             },
             1,
             0
            ]
           }
          },
          Unit3: {
           $sum: {
            $cond: [
             {
              $in: [
               'Unit3',
               '$member.rosterUnits'
              ]
             },
             1,
             0
            ]
           }
          },
          Unit4: {
           $sum: {
            $cond: [
             {
              $in: [
               'Unit4',
               '$member.rosterUnits'
              ]
             },
             1,
             0
            ]
           }
          },
          Unit5: {
           $sum: {
            $cond: [
             {
              $in: [
               'Unit5',
               '$member.rosterUnits'
              ]
             },
             1,
             0
            ]
           }
          },
          Unit6: {
           $sum: {
            $cond: [
             {
              $in: [
               'Unit6',
               '$member.rosterUnits'
              ]
             },
             1,
             0
            ]
           }
          },
          Unit7: {
           $sum: {
            $cond: [
             {
              $in: [
               'Unit7',
               '$member.rosterUnits'
              ]
             },
             1,
             0
            ]
           }
          }
         }
        }, {
         $project: {
          _id: 0
         }
        }]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      相关资源
      最近更新 更多