gpt4 book ai didi

c# - 将 MongoDb _id 从字符串更改为 ObjectId

转载 作者:可可西里 更新时间:2023-11-01 09:12:53 26 4
gpt4 key购买 nike

我们的文档最初是使用 _id 的 StringObjectIdGenerator 类型存储的。较新的数据将使用默认的 ObjectIdGenerator 保存。我们希望能够通过将 _id 转换为新数据类型来迁移现有数据。这可能吗?

最佳答案

是的,可以更改数据类型,我们需要找到所有具有字符串 id 的文档,使用迭代器我们可以通过更改其 _id 来克隆文档,克隆后我们只需要删除旧文档。

下面是一个小文档,对于大集合,你可能需要使用 db.collection.initializeUnorderedBulkOp() 进行批量插入/删除

db.i.find({_id : {$type : 2}}). //find all string _id
forEach(function(d){
var id = ObjectId(d._id); //_id to ObjectId
var oldId = d._id; // _id
d._id = id;
db.i.insert(d); // clone doc with new Id
db.i.remove({ _id : oldId }); // delete old doc
}
)

例子

> db.i.insertMany([{},{},{},{_id : "4a5ec389fee4c182f509f3ba"}, {_id : "4b5ec389fee4c182f509f3ba"}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5a5ec9edfee4c182f509f3c9"),
ObjectId("5a5ec9edfee4c182f509f3ca"),
ObjectId("5a5ec9edfee4c182f509f3cb"),
"4a5ec389fee4c182f509f3ba",
"4b5ec389fee4c182f509f3ba"
]
}


> db.i.find()
{ "_id" : ObjectId("5a5ec9edfee4c182f509f3c9") }
{ "_id" : ObjectId("5a5ec9edfee4c182f509f3ca") }
{ "_id" : ObjectId("5a5ec9edfee4c182f509f3cb") }
{ "_id" : "4a5ec389fee4c182f509f3ba" }
{ "_id" : "4b5ec389fee4c182f509f3ba" }


> db.i.find({_id : {$type : 2}}).
... forEach(function(d){
... var id = ObjectId(d._id);
... var oldId = d._id;
... d._id = id;
... db.i.insert(d);
... db.i.remove({ _id : oldId });
... }
... )


> db.i.find()
{ "_id" : ObjectId("5a5ec9edfee4c182f509f3c9") }
{ "_id" : ObjectId("5a5ec9edfee4c182f509f3ca") }
{ "_id" : ObjectId("5a5ec9edfee4c182f509f3cb") }
{ "_id" : ObjectId("4a5ec389fee4c182f509f3ba") }
{ "_id" : ObjectId("4b5ec389fee4c182f509f3ba") }
>

关于c# - 将 MongoDb _id 从字符串更改为 ObjectId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48291819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com