如何在更新或聚合中生成唯一的 ObjectId?
How to generate a unique ObjectId inside an update or aggregation?
我 collection 中的某些子文档缺少 _id。我写了这段 mongo-shell 代码来尝试添加它们。
db.jobs.updateMany({},
{
$set: {
"artifacts.$[elem]._id": new ObjectId()
}
},
{
arrayFilters: [
{
"elem._id": {
$exists: false
}
}
]
})
此代码成功地为所有适当的子文档提供了 _id,但它为它们提供了所有 相同的 id。关于如何使 ID 唯一的任何想法?
查询
- 使用
$function
的管道更新需要 MongoDB >=4.4
- 我想不出没有 javascript 的方法来生成它,但是使用 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
})
我 collection 中的某些子文档缺少 _id。我写了这段 mongo-shell 代码来尝试添加它们。
db.jobs.updateMany({},
{
$set: {
"artifacts.$[elem]._id": new ObjectId()
}
},
{
arrayFilters: [
{
"elem._id": {
$exists: false
}
}
]
})
此代码成功地为所有适当的子文档提供了 _id,但它为它们提供了所有 相同的 id。关于如何使 ID 唯一的任何想法?
查询
- 使用
$function
的管道更新需要 MongoDB >=4.4 - 我想不出没有 javascript 的方法来生成它,但是使用 javascript 很简单,如下所示
- js 将 运行 在服务器上
*代码可以 运行 使用管道或聚合管道进行更新。 *如果我们没有 MongoDB 聚合运算符,我们总是可以在 4.4
之后使用 javascriptdb.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
})