【问题标题】:mongoose replace values before index猫鼬替换索引前的值
【发布时间】:2021-09-25 16:24:44
【问题描述】:

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

 "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)}
 ]

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

【问题讨论】:

    标签: arrays mongodb mongoose replace database-design


    【解决方案1】:

    您可以从 MongoDB 4.2 开始使用update with aggregation pipeline

    • $indexOfArrayarrayName 中获取输入_id 的索引
    • $add 在上面的返回索引中加一,因为索引从零开始
    • $slice 获取所有高于返回索引的元素
    • $concatArrays concat 以上返回元素,然后输入替换数组
    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
            ]
          }
        }
      }]
    )
    

    Playground

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 2014-02-03
      • 2017-01-26
      • 2018-01-10
      • 2017-09-04
      • 2020-10-03
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多