如何在更新或聚合中生成唯一的ObjectId



我的集合中的一些子文档缺少_id。我写了这段mongoshell代码来尝试添加它们。

db.jobs.updateMany({},
{
$set: {
"artifacts.$[elem]._id": new ObjectId()
}
},
{
arrayFilters: [
{
"elem._id": {
$exists: false
}
}
]
})

这段代码成功地为所有合适的子文档提供了_id,但它为所有提供了相同的id。关于如何使id唯一,有什么想法吗?

查询

  • 使用$function进行管道更新需要MongoDB>4.4
  • 我想不出一种没有javascript的方法来生成它,但有了像bellow这样的javascript就很简单了
  • js将在服务器上运行

*代码可以通过管道或聚合管道在更新时运行。*如果我们没有MongoDB聚合操作符,我们总是可以在4.4 之后使用javascript

此处测试代码

db.collection.update({},
[
{
"$set": {
"artifacts": {
"$function": {
"body": "function (ar) {return ar.map(x => { if(x.hasOwnProperty('_id')) return x; else {x["_id"]=new ObjectId(); return x;}})}",
"args": ["$artifacts"],
"lang": "js"
}
}
}
}
],
{
"multi": true
})

最新更新