Json MongoDB,将对象数组更改为包含其ObjectId的字符串数组

Json MongoDB,将对象数组更改为包含其ObjectId的字符串数组,json,mongodb,mongoose,nosql,Json,Mongodb,Mongoose,Nosql,我有一个包含信息的对象以及其他对象数组的数据库。我想将内部数组更改为仅将每个索引作为ObjectId类型并带有各自ObjectId的数组 我正在使用mongoose populate函数在程序的后面检索此信息。因此,引用只需要ObjectId job { _id: 1, name: "name", parts: [ { _id: ObjectId("5c790ce7d3dc8d00ccc2688c"), name

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

我正在使用mongoose populate函数在程序的后面检索此信息。因此,引用只需要ObjectId

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

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

db.jobs.update(
    {},
    {
        $set: {"parts.$[element]": "element._id"}
    },
    {
        multi: true,
        arrayFilters: [{ "element": {} }]
    }
)
我不确定这是否可行,或者是否只使用mongo shell。

mongo v4.2引入了这一功能,它允许在更新中使用聚合运算符,更重要的是,可以使用自己的值更新文档。这就是你想要实现的

db.jobs.updateMany(
    {},
    [
        {
            '$set': {
                'parts': {
                    '$map': {
                        'input': '$parts',
                        'as': 'part',
                        'in': '$$part._id'
                    }
                }
            }
        }
    ]);
不幸的是,这对于早期的Mongo版本是不可能的。具体而言,
$arrayFilters
允许您过滤数组,但在新的更新语法之前,无法在更新中访问自己的值


您必须迭代所有文档,并在代码中逐个进行更新。

正如@Tom Slabbaert在另一篇文章中提到的,如果您想在一次操作中批量更新文档,您必须使用v4.2中提供的

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

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

这非常有效,谢谢!另外,对于未来的读者来说,您不能在Robo3t中执行此操作,您需要在mongo shell中执行此操作
db.jobs.updateMany({}, {
  $set: { parts: "$parts._id" }
})