Json MongoDB,将对象数组更改为包含其ObjectId的字符串数组
我有一个包含信息的对象以及其他对象数组的数据库。我想将内部数组更改为仅将每个索引作为ObjectId类型并带有各自ObjectId的数组 我正在使用mongoose populate函数在程序的后面检索此信息。因此,引用只需要ObjectIdJson 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
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" }
})