[MongoDB]:更改所有数组字段中的值类型

[MongoDB]:更改所有数组字段中的值类型,mongodb,mongo-shell,objectid,mongodb-update,Mongodb,Mongo Shell,Objectid,Mongodb Update,我有作者和书籍测试集,它们之间有多对多的关系 >db.books.find() [ { _id:ObjectId(“60a676f24312c6d8ea7bd6ec”), 标题:“300年的花生杂耍:纵向分析”, 印文:是的, 作者:['60a673c44312c6d8ea7bd6e9','60a673c44312c6d8ea7bd6ea'] }, { _id:ObjectId(“60a676f24312c6d8ea7bd6ed”), 标题:“神秘溢出:网络上最大的开发者问答平台上的谋杀和混乱。

我有
作者
书籍
测试集,它们之间有多对多的关系

>db.books.find()
[
{
_id:ObjectId(“60a676f24312c6d8ea7bd6ec”),
标题:“300年的花生杂耍:纵向分析”,
印文:是的,
作者:['60a673c44312c6d8ea7bd6e9','60a673c44312c6d8ea7bd6ea']
},
{
_id:ObjectId(“60a676f24312c6d8ea7bd6ed”),
标题:“神秘溢出:网络上最大的开发者问答平台上的谋杀和混乱。”,
印文:是的,
作者:['60a673c44312c6d8ea7bd6eb'],
版本:2
}
]
>db.authors.find()
[
{
_id:ObjectId(“60a673c44312c6d8ea7bd6e9”),
姓名:“Jason Filippou”,
年龄:33岁,
国籍:['GRC,CND'],
书籍:['60a676f24312c6d8ea7bd6ec']
},
{
_id:ObjectId(“60a673c44312c6d8ea7bd6ea”),
姓名:'周玛丽',
年龄:39岁,
国籍:[“美国”],
书籍:['60a676f24312c6d8ea7bd6ec']
},
{
_id:ObjectId(“60a673c44312c6d8ea7bd6eb”),
名称:“Max Schwarz”,
年龄:42,,
工作:'飞行员',
书籍:['60a676f24312c6d8ea7bd6ed']
}
]
我从外部实现了这种关系,从
作者
书籍
字段可以看出。但是,我犯了一个错误,将引用数组设置为原始字符串,而不是
ObjectId
类型。这意味着,例如,
$lookup()
)所需的my联接失败

我尝试使用以下命令批量更新所有字符串,使其
ObjectId
s:

db.books.find({}).forEach(book=>book.authors.forEach(id=>ObjectId(id)))
命令运行时,原始数据未发生变化:

>db.books.find({}).forEach(book=>book.authors.forEach(id=>ObjectId(id)))
>db.books.find()
[
{
_id:ObjectId(“60a676f24312c6d8ea7bd6ec”),
标题:“300年的花生杂耍:纵向分析”,
印文:是的,
作者:['60a673c44312c6d8ea7bd6e9','60a673c44312c6d8ea7bd6ea']
},
{
_id:ObjectId(“60a676f24312c6d8ea7bd6ed”),
标题:“神秘溢出:网络上最大的开发者问答平台上的谋杀和混乱。”,
印文:是的,
作者:['60a673c44312c6d8ea7bd6eb'],
版本:2
}
]
>db.authors.find()
[
{
_id:ObjectId(“60a673c44312c6d8ea7bd6e9”),
姓名:“Jason Filippou”,
年龄:33岁,
国籍:['GRC,CND'],
书籍:['60a676f24312c6d8ea7bd6ec']
},
{
_id:ObjectId(“60a673c44312c6d8ea7bd6ea”),
姓名:'周玛丽',
年龄:39岁,
国籍:[“美国”],
书籍:['60a676f24312c6d8ea7bd6ec']
},
{
_id:ObjectId(“60a673c44312c6d8ea7bd6eb”),
名称:“Max Schwarz”,
年龄:42,,
工作:'飞行员',
书籍:['60a676f24312c6d8ea7bd6ed']
}
]

我的错误是什么?

如果您决定将所有图书字符串更新为ObjectId,您可以使用


您可以在查找中使用
toString()
convert()
如果需要更新,您需要使用
updateMany()
update()
答案对您有帮助吗?
db.authors.updateMany({},[
  {
    "$addFields": {
      "books": {
        "$map": {
          "input": "$books",
          "in": {
            "$toObjectId": "$$this"
          }
        }
      }
    }
  }
])