【问题标题】:MongoDB, change array of objects to an array of strings containing their ObjectIdMongoDB,将对象数组更改为包含其 ObjectId 的字符串数组
【发布时间】:2020-11-13 06:17:08
【问题描述】:

我有一个充满包含信息的对象的数据库,以及其他对象数组。我想将内部数组更改为仅将每个索引作为 ObjectId 类型以及它们各自的 ObjectId 的数组

我稍后在程序中使用 mongoose 填充函数来检索此信息。所以引用只需要 ObjectId。

job { 
    _id: 1,
    name: "name",
    parts: [ 
        { _id: ObjectId("5c790ce7d3dc8d00ccc2688c"), name: "name"},
        { _id: ObjectId("5c790ce7d3dc8d00ccc2688b"), name: "name"},
        { _id: ObjectId("5c790ce7d3dc8d00ccc2688a"), name: "name"},
    ]
}

想要的结果

job {
    _id: 1,
    name: "name",
    parts: [
        ObjectId("5c790ce7d3dc8d00ccc2688c"),
        ObjectId("5c790ce7d3dc8d00ccc2688b"),
        ObjectId("5c790ce7d3dc8d00ccc2688a")
    ]
}

我从命令行尝试了一些 mongoDB 查询,但它们都没有给出我需要的结果。这个没有错误,但似乎没有任何改变。

db.jobs.update(
    {},
    {
        $set: {"parts.$[element]": "element._id"}
    },
    {
        multi: true,
        arrayFilters: [{ "element": {} }]
    }
)

我不确定这是否可能仅使用 mongo shell。

【问题讨论】:

    标签: json mongodb mongoose nosql


    【解决方案1】:

    正如@Tom Slabbaert 在另一个answer 中提到的,如果您想在一个操作中批量更新文档,则必须使用v4.2 中可用的updates with aggregation pipelines

    作为使用$map 的替代方法,如果您只希望顶层有一个值并且可以使用点表示法访问该值。您可以简单地将$set 与点符号一起使用。

    db.jobs.updateMany({}, {
      $set: { parts: "$parts._id" }
    })
    

    【讨论】:

      【解决方案2】:

      Mongo v4.2 引入了pipelined updates 这允许在更新中使用聚合运算符,更重要的是使用它自己的值更新文档。这就是你想要达到的目标。

      db.jobs.updateMany(
          {},
          [
              {
                  '$set': {
                      'parts': {
                          '$map': {
                              'input': '$parts',
                              'as': 'part',
                              'in': '$$part._id'
                          }
                      }
                  }
              }
          ]);
      

      不幸的是,这对于早期的 Mongo 版本是不可能的。具体来说,$arrayFilters 允许您过滤数组,但在新的更新语法之前再次访问更新中的自己的值是不可能的。

      您必须遍历所有文档并在代码中一一进行更新。

      【讨论】:

      • 效果很好,谢谢!也不适合未来的读者,你不能在 Robo3t 中执行这个,你需要在 mongo shell 中
      猜你喜欢
      • 2021-05-13
      • 2019-06-06
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2022-01-14
      • 2023-02-06
      • 2014-04-20
      • 2016-12-30
      相关资源
      最近更新 更多