【问题标题】:Duplicate a document in MongoDB using a new _id使用新的 _id 在 MongoDB 中复制文档
【发布时间】:2012-08-01 16:14:27
【问题描述】:

好吧,我想这是一个愚蠢的问题,可能有一个简单的答案。

如何在 MongoDB 中复制文档,更改新文档的 _id?

想象你有原始文件:

> var orig = db.MyCollection.findOne({_id: 'hi'})

现在我想要集合中的另一个带有 _id 'bye' 的文档。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    只需更改 id 并重新插入即可。

    > db.coll.insert({_id: 'hi', val: 1})
    > var orig = db.coll.findOne({_id: 'hi'})
    > orig._id = 'bye'
    bye
    > db.coll.insert(orig)
    > db.coll.find()
    { "_id" : "hi", "val" : 1 }
    { "_id" : "bye", "val" : 1 }
    

    【讨论】:

    • 如果你想克隆行,但不明确输入新的 id,只需在执行插入命令之前删除“_id”属性:delete orig._id
    【解决方案2】:

    你可以给副本 Document 一个新的 ObjectId。在 mongo 外壳中

    var copy = db.collection.findOne();
    for (var i = 0; i< 30; i++){ 
        copy._id = new ObjectId(); 
        db.collection.insert(copy);
    }
    

    【讨论】:

    • 第一个 var 应该是 const。不过很好的解决方案!
    【解决方案3】:

    对@689 响应的一点改进

    var copy = db.collection.findOne({},{_id:0});
    for (var i = 0; i< 30; i++){ 
        db.collection.insert(copy);
    }
    

    【讨论】:

    • 我不知道怎么做。每次插入都会创建一个新的统一 _id。
    • 添加delete copy._id
    • {_id: 0} 不需要delete copy._id,因为_id 没有被获取
    • 如果我运行这个脚本,它只会复制同一个文档 30 次。如何修改它以复制 100 个不同的文档(任何文档)?
    • 对于轻度用户,上面代码中的collection 必须替换为您的实际集合名称。
    【解决方案4】:

    您可以使用以下代码:

    使用单行运行:

    db.collectionName.find({"_id" : ObjectId("5a4e47e0a21698d455000009")}).forEach(function(doc){var newDoc = doc; delete newDoc._id; db.collectionName.insert(newDoc); })
    

    一种便于理解的结构格式:

    db.collectionName.find({"_id" : ObjectId("5a4e47e0a21698d455000009")}).forEach(function(doc){
        var newDoc = doc;
        delete newDoc._id;
        db.collectionName.insert(newDoc);
    })
    

    【讨论】:

      【解决方案5】:

      在 mongo shell 中:没关系

      db.products.find().forEach( function(doc){db.products.insert(
      {
          "price":doc.price,
          "name":doc.name,
          "typeName":doc.typeName,
          "image":doc.image
      }
      )} );
      

      【讨论】:

        【解决方案6】:

        单行

        (function(doc){delete doc._id; db.collection.insert(doc)})(db.collection.findOne({ _id: ObjectId("60c9a684c7d51907c35ad463")}))

        结构化

        (function(doc) {
          delete doc._id;
          db.collection.insert(doc);
        })(db.collection.findOne({ _id: ObjectId('60c9a684c7d51907c35ad463') }));
        
        // (function(doc){...})(doc)
        

        【讨论】:

        • 谁能解释我做错了什么?请
        猜你喜欢
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 2016-03-26
        • 2017-01-01
        • 2011-04-30
        相关资源
        最近更新 更多