59

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

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

想象你有原始文件:

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

现在我想要集合中的另一个文档,其中 _id 为“再见”。

4

6 回答 6

110

只需更改 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 }
于 2012-08-01T16:17:11.637 回答
33

您可以为副本 Document 提供一个新的 ObjectId。在 mongo 外壳中

var copy = db.collection.findOne();
for (var i = 0; i< 30; i++){ 
    copy._id = new ObjectId(); 
    db.collection.insert(copy);
}
于 2014-06-04T09:49:56.640 回答
32

对@689 响应的一点改进

var copy = db.collection.findOne({},{_id:0});
for (var i = 0; i< 30; i++){ 
    db.collection.insert(copy);
}
于 2014-09-13T17:31:28.580 回答
23

您可以使用以下代码:

使用单行运行:

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);
})
于 2018-01-09T13:31:26.907 回答
2

在 mongo shell 中:没关系

db.products.find().forEach( function(doc){db.products.insert(
{
    "price":doc.price,
    "name":doc.name,
    "typeName":doc.typeName,
    "image":doc.image
}
)} );
于 2018-08-23T04:16:16.183 回答
-1

单线

(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)
于 2021-11-12T12:28:29.547 回答