db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})
Performing an update on the path '_id' would modify the immutable field '_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")})
db.clients.aggregate([
{$addFields: {
_id: {$function: {
body: function(id) {
// not sure if this exact condition will work but you get the gist
return id === ObjectId("123") ? ObjectId("456") : id;
},
args: ["$_id"],
lang: "js"
}}
}},
{$out: "clients"}
]);
8条答案
按热度按时间nnvyjq4y1#
您无法更新它。您必须使用新的
_id
保存文档,然后删除旧文档。6za6bjd02#
要对整个集合执行此操作,您也可以使用循环(基于Niels示例):
在本例中,UserId是我想使用的新ID
y4ekin9u3#
如果你想在同一个集合中重命名_id(例如,如果你想给一些_id加前缀):
c9x0cxw04#
这里我有一个解决方案,可以避免多个请求,for循环和旧文档删除。
您可以轻松地创建一个新的想法手动使用类似的东西:
_id:ObjectId()
但是知道Mongo会在缺少_id的情况下自动分配一个_id,您可以使用aggregate创建一个包含文档中所有字段的$project
,但省略field _id。然后可以使用$out
保存它如果你的文件是:
然后你的查询将是:
ojsjcaue5#
您也可以从MongoDB compass或使用命令创建一个新文档,并设置您想要的
specific _id
值。t9eec4r06#
作为对上述答案的一个很小的改进,我建议使用
然后
这样我们就不需要创建额外的变量来保存old _id。
55ooxyrt7#
稍微修改了上面@Florent Arlandis的例子,我们从文档中的不同字段插入_id:
不要像@Florent Arlandis的回答那样使用
$match
filter +$out
,因为$out在插入聚合结果之前会完全删除集合中的数据,所以实际上你会丢失所有与$match
filter不匹配的数据mec1mxoz8#
您可以尝试在
$out
stage中使用聚合,除了要修改的id之外,其他所有id都保持不变。