MongoDB - 使用迭代更新集合上的每个“_id”字段

Posted

技术标签:

【中文标题】MongoDB - 使用迭代更新集合上的每个“_id”字段【英文标题】:MongoDB - Update every "_id" field on a collection with an iteration 【发布时间】:2018-09-09 12:15:52 【问题描述】:

我有一个从 PostgreSQL 导入的名为“inserogato”的庞大集合(68017 个文档)。 在 PostgreSQL 中,表“inserogato”的主键是“id”,但 MongoDB 创建一个名为“_id”的默认主键,其类型为 ObjectId。所以我想将字段“id”中的所有值复制到字段“_id”。

Some fields of a document

我试过了,但它只更新了一个文档:

db.inserogato.find("_id" : ObjectId("5abe1d264887072726b19b2e")).forEach(function(doc) 
    var oldId = doc._id;
    doc._id = NumberLong(doc.id);  
    db.inserogato.remove( _id: oldId );
    db.inserogato.save(doc);
); 

【问题讨论】:

How update the _id of one MongoDB Document?的可能重复 【参考方案1】:

Emanuele,您不能删除或编辑 MongoDB 集合的 _id。 如果这是您需要完成的任务,您将需要创建一个具有正确 ID 的新集合。

步骤:

    复制集合(原件/副本) 删除原文 使用正确的 _id 重新创建原始文件

如果您想按照您的示例进行操作,则需要遍历所有集合(不要指定 _id)

db.inserogato.find().forEach(function(doc) 
 var oldId = doc._id;
 doc._id = NumberLong(doc.id);  
 db.inserogato.remove( _id: oldId );
 db.inserogato.save(doc);
); 

【讨论】:

抱歉回复晚了!您的想法是正确的道路,但该代码仅适用于 8000 或 10000 个文档,但它给了我错误!按照这个想法,我找到了另一个解决方案!我只是编写了一个 Java 程序,它使用正确的 _id 重新创建原始集合,并且成功了!

以上是关于MongoDB - 使用迭代更新集合上的每个“_id”字段的主要内容,如果未能解决你的问题,请参考以下文章

使用不同的值更新 mongoDb 集合的每个文档的相同属性

迭代mongoDB集合,为每个项执行聚合的异步任务,并且当它们全部完成时返回响应中的JSON

在跟踪集合上的更新操作时,如何在使用 kafka mongodb 源连接器时获取完整文档?

MongoDB - 使用 javascript 更新子文档

MongoDB - 使用 javascript 更新子文档

无法更新 mongoDB 文档