【问题标题】:How to get length of array in mongodb $group operator?如何在 mongodb $group 运算符中获取数组的长度?
【发布时间】:2021-06-08 17:18:14
【问题描述】:

我的收藏数据是这样的:

[
  { "_id": 1, "s": "a", "kc": 100 },
  { "_id": 2, "s": "a", "kc": 101 },
  { "_id": 3, "s": "a", "kc": 102 },
  { "_id": 4, "s": "a", "kc": 103 },
  { "_id": 5, "s": "b", "kc": 200 },
  { "_id": 6, "s": "b", "kc": 201 },
  { "_id": 7, "s": "b", "kc": 202 },
  { "_id": 8, "s": "b", "kc": 203 }
]

我使用这个聚合:

db.collection.aggregate([
  {
    "$group": {
      _id: "$s",
      kcList: {
        "$push": "$kc"
      }
    }
  }
])

结果如下:

[
  {
    "_id": "a",
    "kcList": [
      100,
      101,
      102,
      103
    ]
  },
  {
    "_id": "b",
    "kcList": [
      200,
      201,
      202,
      203
    ]
  }
]

我想更改我的查询,使kcList 中的数据分组时,每个项目都乘以它的数组索引。

我想要的结果如下:

[
  {
    "_id": "a",
    "kcList": [
      100 * 0,
      101 * 1,
      102 * 2,
      103 * 3
    ]
  },
  {
    "_id": "b",
    "kcList": [
      200 * 0,
      201 * 1,
      202 * 2,
      203 * 3
    ]
  }
]

所以我写了这个查询:

db.collection.aggregate([
  {
    "$group": {
      _id: "$s",
      kcList: {
        "$push": {
          "$multiply": [
            "$kc",
            {
              $cond: {
                if: {
                  $isArray: "$kcList"
                },
                then: {
                  $size: "$kcList"
                },
                else: 0
              }
            }
          ]
        }
      }
    }
  }
])

但是结果是错误的:( 你有什么办法解决这个问题吗?

Mongo playground

【问题讨论】:

  • 您提供的预期输出不清楚。 100 * 0101 * 1 是什么意思?
  • 100 , 101 , 102 , 103 是“kc”值,0 , 1 , 2 , 3 是数组项索引

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

在小组赛之后添加新赛段,

  • $range 使用 $size 创建一个从 0 到长度为 kcList 数组的数字数组
  • $map 迭代上述范围的循环
  • $arrayElemAt 获取kcList 数组中范围位置的元素
  • $multiply 将范围数与上述操作返回的 kcList 值相乘
db.collection.aggregate([
  {
    $group: {
      _id: "$s",
      kcList: { $push: "$kc" }
    }
  },
  {
    $project: {
      kcList: {
        $map: {
          input: { $range: [0, { $size: "$kcList" }] },
          in: {
            $multiply: [
              { $arrayElemAt: ["$kcList", "$$this"] },
              "$$this"
            ]
          }
        }
      }
    }
  }
])

Playground

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多