如何更新一个MongoDB文档的_id?

时间:2010-10-25 08:19:25

标签: mongodb

我想要更新一个文档的_id MongoDB。我知道这不是一个非常好的实践。但由于某些技术原因,我需要更新它。但如果我尝试更新它,我有:

> db.clients.update({'_id':ObjectId("4cc45467c55f4d2d2a000002")}, {'$set':{'_id':ObjectId("4c8a331bda76c559ef000004")}});
Mod on _id not allowed

并未进行更新。我怎么能真正更新它?

5 个答案:

答案 0 :(得分:185)

您无法更新它。您必须使用新的_id保存文档,然后删除旧文档。

// store the document in a variable
doc = db.clients.findOne({_id: ObjectId("4cc45467c55f4d2d2a000002")})

// set a new _id on the document
doc._id = ObjectId("4c8a331bda76c559ef000004")

// insert the document, using the new _id
db.clients.insert(doc)

// remove the document with the old _id
db.clients.remove({_id: ObjectId("4cc45467c55f4d2d2a000002")})

答案 1 :(得分:27)

要为整个集合执行此操作,您还可以使用循环(基于Niels示例):

db.status.find().forEach(function(doc){ 
    doc._id=doc.UserId; db.status_new.insert(doc);
});
db.status_new.renameCollection("status", true);

在这种情况下,UserId是我想要使用的新ID

答案 2 :(得分:2)

如果您想在同一个集合中重命名_id(例如,如果您想为某些_ids添加前缀):

db.someCollection.find().snapshot().forEach(function(doc) { 
   if (doc._id.indexOf("2019:") != 0) {
       print("Processing: " + doc._id);
       var oldDocId = doc._id;
       doc._id = "2019:" + doc._id; 
       db.someCollection.insert(doc);
       db.someCollection.remove({_id: oldDocId});
   }
});

if(doc._id.indexOf(" 2019:")!= 0){... 需要防止无限循环,因为forEach选择插入的文档,甚至可以使用 .snapshot()方法。

答案 3 :(得分:0)

在这里,我有一个避免重复请求和循环删除旧文档的解决方案。

您可以使用类似_id:ObjectId()的方法轻松地手动创建新想法 但是,如果知道Mongo会自动分配一个_id(如果缺少),则可以使用聚合来创建一个$project,其中包含文档的所有字段,但忽略字段_id。然后,您可以使用$out

保存它

因此,如果您的文档是:

{
"_id":ObjectId("5b5ed345cfbce6787588e480"),
"title": "foo",
"description": "bar"
}

然后您的查询将是:

    db.getCollection('myCollection').aggregate([
        {$match:
             {_id: ObjectId("5b5ed345cfbce6787588e480")}
        }        
        {$project:
            {
             title: '$title',
             description: '$description'             
            }     
        },
        {$out: 'myCollection'}
    ])

答案 4 :(得分:0)

您还可以通过MongoDB指南针或使用命令来创建新文档,并设置所需的<div class="skills__container bd-grid"> <div class="row"> <div class="column"> <class="column-box"> <h2>Column 1</h2> <p>Some text</p> </div> </div> <div class="column"> <class="column-box"> <h3>Column 2</h3> </div> </div> <div> </div>值。