我可以通过其id更新mongodb的现有记录吗?

11 浏览
0 Comments

我可以通过其id更新mongodb的现有记录吗?

我想更新一个文档的_id字段。我知道这不是一个好的做法。但由于某些技术原因,我需要更新它。

如果我尝试更新它,我会收到以下错误信息:

db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})
Performing an update on the path '_id' would modify the immutable field '_id'

更新被拒绝了。我该如何更新它呢?

0
0 Comments

从上述内容可以得到以下问题的原因和解决方法:

问题原因:在MongoDB中,想要通过id来更新现有记录,但是代码中的方法find(...).snapshot报错find(...).snapshot is not a function

解决方法:在代码中使用forEach循环遍历集合中的文档,通过检查doc._id.indexOf("2019:") != 0来防止无限循环,并在更新完成后删除旧的文档。如果想要替换_id为自定义id,可以使用doc._id.toString().length === 24来防止无限循环。

以下是整理后的文章:

在MongoDB中,如果想要通过id来更新现有记录,可以使用一些方法。但是在实际操作中,可能会遇到一些问题。

例如,在同一个集合中重命名_id(例如,如果想要给一些_id添加前缀)时,可以使用如下代码:

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});
   }
});

但是,在上述代码中,find(...).snapshot方法会报错find(...).snapshot is not a function,导致无法正常执行更新操作。

为了解决这个问题,可以在代码中使用forEach循环遍历集合中的文档,并通过doc._id.indexOf("2019:") != 0来防止无限循环。同时,在更新完成后,可以通过删除旧的文档来完成更新操作。

另外,如果想要替换_id为自定义id,可以使用doc._id.toString().length === 24来防止无限循环。这样可以避免与MongoDB默认的_id长度(24个字符)相冲突。

总结起来,以上方法可以解决在MongoDB中通过id更新现有记录的问题,并提供了一些注意事项和解决方案。

0
0 Comments

问题的原因是这段代码在使用forEach循环时出现了无限循环的问题。解决方法是使用list()代替snapshot()来遍历集合,并且在处理大型数据库时要注意内存的消耗。下面是整理后的文章:

可以通过以下代码来更新MongoDB中现有记录的ID吗?

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

在这个例子中,我想使用UserId作为新的ID。但是这段代码会导致无限循环的问题。使用snapshot()并不能解决这个问题,因为它无法捕捉到新添加的文档。可以尝试使用list()来替代snapshot(),但是对于大型数据库,这可能会耗尽内存。

有人说这段代码有11个赞,但是又有人说它是一个无限循环?这是怎么回事?

这是因为当代的流行编码文化认为在验证输入是否有效之前,应该先承认好的建议。

0
0 Comments

文章标题:如何通过id更新已有的MongoDB记录?

在MongoDB中,无法直接通过id更新已有的记录。解决方法是保存该文档到一个变量中,然后使用一个新的id插入该文档,最后删除旧的文档。

示例代码如下:

// 将文档存储到变量中
doc = db.clients.findOne({_id: ObjectId("4cc45467c55f4d2d2a000002")})
// 为文档设置新的id
doc._id = ObjectId("4c8a331bda76c559ef000004")
// 使用新的id插入文档
db.clients.insert(doc)
// 删除旧的id对应的文档
db.clients.remove({_id: ObjectId("4cc45467c55f4d2d2a000002")})

然而,如果文档中的某个字段具有唯一索引,那么上述方法会失败,因为在唯一索引字段中插入重复值是不允许的。解决这个问题的方法是先删除旧的文档,然后再进行插入操作。不过这种方法存在一个问题,如果插入操作失败,数据将会丢失。因此,更好的方法是先删除索引,进行操作,然后再恢复索引。

另外,如果在插入操作中出现"重复键错误",并且不担心上述问题,最简单的解决方法是先调用删除操作,然后再调用插入操作。即使插入操作失败,也可以通过屏幕上已打印的文档进行恢复。

如果不指定字符串参数,只使用ObjectId(),将生成一个新的唯一id。

如果你选择了先删除索引再进行操作的方法,可能会发现在删除和恢复索引的过程中会花费很多时间(几秒钟)。这样做可能会导致索引字段中插入重复记录,在重新建立索引时可能会出现各种问题。解决这个问题的最佳方法是在此过程中计划一个停机时间并停止所有写入操作。另一种稍微轻松一些的方法是将应用程序临时转为只读模式。将写入数据库的所有应用程序重新配置为只指向一个辅助节点。在此期间,读取操作将成功,但写入操作将失败,数据库将保持静态状态。

最好的解决方法是将具有新id的对象插入到一个临时集合中。完成后,从原始集合中删除该项。然后,将临时集合中的项插入到原始集合中,成功后从临时集合中删除它们(可以一次性删除或逐个删除,具体取决于情况)。

总之,MongoDB不允许直接通过id更新已有的记录,需要通过先保存、插入和删除的方式来实现。在某些情况下,可能需要额外的操作来解决唯一索引和维护数据一致性的问题。

0