我想要更新一个文档的_id MongoDB。我知道这不是一个非常好的实践。但由于某些技术原因,我需要更新它。但如果我尝试更新它,我有:
> db.clients.update({'_id':ObjectId("4cc45467c55f4d2d2a000002")}, {'$set':{'_id':ObjectId("4c8a331bda76c559ef000004")}});
Mod on _id not allowed
并未进行更新。我怎么能真正更新它?
答案 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>
值。