MongoDB:将项目添加到指定索引处的数组中,即使数组大小小于索引

问题描述 投票:0回答:1

如何向大于数组大小的位置插入值,中间位置用null填充。

原始数据库:

[
  {
    "arr": ["a", "b"]
  },
  {
    "arr": ["a", "b", "c"]
  }
]

我想要什么(在第5个索引处插入“f”):

[
  {
    "arr": ["a", "b", null, null, null, "f"]
  },
  {
    "arr": ["a", "b", "c", null, null, "f"]
  }
]
如果 size 小于位置,

$push
运算符会将元素追加到末尾。

此外,这必须在单个

updateMany()
调用中完成。

发现一个与此类似的问题,但没有答案。

我尝试过但不起作用:

$push: { arr: { $each: [null, null, null, null], $slice: 4 },
$push: { arr: "f" }
mongodb nosql
1个回答
0
投票

这样做的规范方法之一:

  1. 将空值附加到当前数组。
  2. $unwind
    使用
    includeArrayIndex
    选项为数组索引生成字段
    idx
  3. 有条件地
    $set
    arr
    的内容由
    idx
  4. 的值决定
  5. 修剪
    idx
    大于您指定索引的文档
  6. 重新组合文档
  7. $merge
    更新回收藏
db.collection.aggregate([
  {
    "$set": {
      arr: {
        "$concatArrays": [
          "$arr",
          {
            "$map": {
              "input": {
                "$range": [
                  0,
                  // your indexInput here
                  5
                ]
              },
              "as": "entry",
              "in": null
            }
          }
        ]
      }
    }
  },
  {
    "$unwind": {
      path: "$arr",
      includeArrayIndex: "idx"
    }
  },
  {
    "$set": {
      "arr": {
        "$cond": {
          "if": {
            $eq: [
              "$idx",
              // your inputIdx here
              5
            ]
          },
          "then": // your input here
          "f",
          "else": "$arr"
        }
      }
    }
  },
  {
    "$match": {
      idx: {
        $lte: // your inputIdx here
        5
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "arr": {
        "$push": "$arr"
      }
    }
  },
  {
    "$merge": {
      "into": "collection"
    }
  }
])

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.