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.
我有一个名为 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.