如何给mongodb嵌套数组中的项添加数组索引字段

enyaitl3  于 2022-12-29  发布在  Go
关注(0)|答案(1)|浏览(169)

受另一个问题的启发,我正在寻找一种通用的方法,将带有索引的字段添加到嵌套数组中的每一项。
假设我的文档如下所示:

{
    _id: ObjectId("5a934e000102030405000000"),
    events: [
      {
        status: 0,
        timestamp: ISODate("2022-05-29T13:26:00Z")
      },
      {
        status: 8,
        timestamp: ISODate("2022-05-29T14:41:00Z")
      },
      {
        status: 4,
        timestamp: ISODate("2022-05-31T10:13:00Z")
      },
      {
        status: 3,
        timestamp: ISODate("2022-05-31T10:18:00Z")
      }
    ]
  }

我希望每一项都包含一个新的字段,该字段是数组中该项的索引:

{
    _id: ObjectId("5a934e000102030405000000"),
    events: [
      {
        arrayIndex: 0,
        status: 0,
        timestamp: ISODate("2022-05-29T13:26:00Z")
      },
      {
        arrayIndex: 1,
        status: 8,
        timestamp: ISODate("2022-05-29T14:41:00Z")
      },
      {
        arrayIndex: 2,
        status: 4,
        timestamp: ISODate("2022-05-31T10:13:00Z")
      },
      {
        arrayIndex: 3,
        status: 3,
        timestamp: ISODate("2022-05-31T10:18:00Z")
      }
    ]
  }
30byixjq

30byixjq1#

从mongoDB版本3.4开始,这可以使用带有$reduce阶段的聚合管道来完成,它使用新累加数组的大小:

db.collection.aggregate([
  {$project: {
      events: {
        $reduce: {
          input: "$events",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              [
                {$mergeObjects: [
                    "$$this",
                    {arrayIndex: {$size: "$$value"}}
                ]}
              ]
            ]
          }
        }
      }
  }}
])

了解它在playground example上的工作原理

相关问题