如何在更新或聚合中生成唯一的 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

Test code here

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
})