Mongodb 更新所有具有唯一 ID 的文档

Mongodb update all the documents with unique id

我有一个名为 products 的集合,其中包含将近 10 万份文档。我想在所有文档中引入一个名为 secondaryKey 且具有唯一值 uuid 的新键。 我使用 nodejs.

执行此操作

我面临的问题:-

当我尝试下面的查询时,

db.collection('products').updateMany({},{"$set":{secondaryKey: uuid()}});

这里它用相同的 uuid 值更新所有文档,

我尝试用循环逐一更新文档,但这里的问题是我在 updateOne 中没有 filter 值,因为我想更新所有文档。

任何人都可以在这里帮助我。 谢谢:)

由于您要在每个文档中放入的值不同,因此您必须使用循环。

在您的循环中,您必须更新迭代的当前文档。所以你必须在 updateOne

中使用 _id 进行过滤

如果你使用的是 MongoDB 版本 >= 4.4 你可以试试这个:

db.products.updateMany(
    {},
    [
        {
            $set: {
                secondaryKey: {
                    $function: {
                        body: function() {
                            return UUID().toString().split('"')[1];
                        },
                        args: [],
                        lang: "js"
                    }
                }
            }
        }
    ]
);

输出

[
  {
    "_id": ObjectId("..."),
    "secondaryKey": "f41b15b7-a0c5-43ed-9d15-69dbafc0ed29"
  },
  {
    "_id": ObjectId("..."),
    "secondaryKey": "50ae7248-a92e-4b10-be7d-126b8083ff64"
  },
  {
    "_id": ObjectId("..."),
    "secondaryKey": "fa778a1a-371b-422a-b73f-8bcff865ad8e"
  }
]

以上回复对我无效。此外,当您在数据库上启用 javascript 时,它会危及安全性(请参阅 here $function 和 javascript 在数据库上启用)。最好的方法是不要让你的服务器超载,在本地做你的工作如下:

const { nanoid, customAlphabet } = require('nanoid') 

async function asdf() {


const movies = await client.db("localhost").collection("productpost");
var result2 = []

let result = await movies.find({}).toArray()
result.forEach(element => {
    const nanoid = customAlphabet('1234567890', 10)
    console.log(element.price)
    element.price = 4
    element.id = nanoid()
    result2.push(element)
});
console.log("out reult2", result2)
await movies.deleteMany({})
await movies.insertMany(result2) 
})

它将删除您 collection 上的所有 object 并更新为新的。使用 nanoid 作为 uniqueids。

这是数据库 object 添加唯一 id 后的数组:

{  "_id": {    "$oid": "334a98519a20b05c20574dd1"  },  "attach": "[\"http://localhost:8000/be/images/2022/4/bitfinicon.png\"]",  "title": "jkn jnjn",  "description": "jnjn",  "price": 4,  "color": "After viewing I am 48.73025772956596% more satisfied with life.",  "trademark": "",  "category": "[]",  "productstate": "Published",  "createdat": {    "$date": "2022-04-03T17:40:54.743Z"  },  "language": "en"}

P.S:请在执行此操作之前备份您的 collection 或根据您的需要过滤数组,以免遍历所有 collection.