首页 > 解决方案 > 猫鼬替换索引前的值

问题描述

我有一个集合,里面有一个这样的数组(数组长度不同)

 "arrayName": [
    {"name": "D", "_id": ObjectId(IDOFD)},
    {"name": "C", "_id": ObjectId(IDOFC)},
    {"name": "B", "_id": ObjectId(IDOFB)},
    {"name": "A", "_id": ObjectId(IDOFA)}
 ]

我试图替换该数组中某个元素之前的所有值 - 假设我想替换该元素之前的每个元素"_id": ObjectId(IDOFB)(如果具有此 id 的元素是数组的最后一个元素,只需在指定之后推送“replacementValues”数组元素)与:

"replacementValues": [
    {"name": "REPLACE 1", "_id": ObjectId(IDOFREPLACE 1)},
    {"name": "REPLACE 2", "_id": ObjectId(IDOFREPLACE 2)}
 ]

这将导致:

"arrayName": [
    {"name": "D", "_id": ObjectId(IDOFD)},
    {"name": "C", "_id": ObjectId(IDOFC)},
    {"name": "B", "_id": ObjectId(IDOFB)},
    {"name": "REPLACE 1", "_id": ObjectId(IDOFREPLACE 1)},
    {"name": "REPLACE 2", "_id": ObjectId(IDOFREPLACE 2)}
 ]

我怎样才能做到这一点?任何帮助将不胜感激!

标签: arraysmongodbmongoosereplacedatabase-design

解决方案


从 MongoDB 4.2 开始,您可以将更新与聚合管道一起使用,

  • $indexOfArray获取输入_id索引arrayName
  • $add在上面的返回索引中加一,因为索引从零开始
  • $slice获取高于返回索引的所有元素
  • $concatArrays连接上面的返回元素,然后输入替换数组
let replacementValues = [
  { "name": "REPLACE 1", "_id": ObjectId(IDOFREPLACE 1) },
  { "name": "REPLACE 2", "_id": ObjectId(IDOFREPLACE 2) }
];
let _id = ObjectId(IDOFB);

YourSchemaModel.updateOne(
  {}, // put your query
  [{
    $set: {
      arrayName: {
        $concatArrays: [
          {
            $slice: [
              "$arrayName",
              0,
              {
                $add: [
                  { $indexOfArray: ["$arrayName._id", _id] },
                  1
                ]
              }
            ]
          },
          replacementValues
        ]
      }
    }
  }]
)

操场


推荐阅读