当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《如何更新一个MongoDB文档的_id?》经验,为你挑选了2个好方法。

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

> db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})

Performing an update on the path '_id' would modify the immutable field '_id'

而且没有更新.我怎么能真正更新它?



1> Niels van de..:

你无法更新它.您必须使用新文档保存文档_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")})


如果该文档上的某些字段具有唯一索引,则会出现一个有趣的问题.在这种情况下,您的示例将失败,因为无法在唯一索引字段中插入具有重复值的文档.您可以通过先执行删除来解决此问题,但这是一个坏主意,因为如果您的插入由于某种原因失败,您的数据现在会丢失.您必须删除索引,执行工作,然后恢复索引.

2> Patrick Wolf..:

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

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

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


呃,这有11个赞成,但是有人说这是一个无限循环?这是什么交易?
@Andrew因为当代流行编码器文化要求你在实际验证所述输入确实有效之前应该总是承认好的输入.
推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有