在MongoDB中使用new _id复制文档

plicqrtu  于 2023-08-04  发布在  Go
关注(0)|答案(8)|浏览(103)

好吧,我想这是一个愚蠢的问题,可能有一个简单的答案。
如何在MongoDB中复制文档,更改新文档的_id?
您拥有原始文档的图像:

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

字符串
现在我需要集合中的另一个文档,其_id为'bye'。

9njqaruj

9njqaruj1#

只需更改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 }

字符串

ldioqlga

ldioqlga2#

您可以为副本Document给予新的ObjectId。在mongo shell里

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

字符串

xfyts7mz

xfyts7mz3#

对@689响应的一点改进

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

字符串

6gpjuf90

6gpjuf904#

你可以使用下面的代码:

单线运行:

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

b4qexyjb

b4qexyjb5#

在mongo shell中:没关系

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

字符串

6fe3ivhb

6fe3ivhb6#

前面的许多答案都很简单和正确,但是如果您的目标是用新的_id复制集合中的所有文档,那么这些答案就没有效率了。下面是一个三行解决方案,对我来说快了10倍以上:
首先有效地复制集合:

db.collection.aggregate([{ $out: "collection_copy" }]);

字符串
现在将文档从副本传递回原始文档,但删除_id字段,从而生成新的_id

db.collection_copy.aggregate([{$project: {_id: 0}}, { $merge: "collection" }]);


最后,清理副本:

db.collection_copy.drop();

zbwhf8kr

zbwhf8kr7#

单线

(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)

vmjh9lq9

vmjh9lq98#

用管道

db.collection.insertMany(
db.collection.aggregate([
    {
        $match: { _id: ObjectId("") }
    },
     
 { $unset: [ "_id"] }]).toArray());

字符串

相关问题