好吧,我想这是一个愚蠢的问题,可能有一个简单的答案。如何在MongoDB中复制文档,更改新文档的_id?您拥有原始文档的图像:
> var orig = db.MyCollection.findOne({_id: 'hi'})
字符串现在我需要集合中的另一个文档,其_id为'bye'。
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 }
字符串
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); }
xfyts7mz3#
对@689响应的一点改进
var copy = db.collection.findOne({},{_id:0}); for (var i = 0; i< 30; i++){ db.collection.insert(copy); }
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); })
型
b4qexyjb5#
在mongo shell中:没关系
db.products.find().forEach( function(doc){db.products.insert( { "price":doc.price, "name":doc.name, "typeName":doc.typeName, "image":doc.image } )} );
6fe3ivhb6#
前面的许多答案都很简单和正确,但是如果您的目标是用新的_id复制集合中的所有文档,那么这些答案就没有效率了。下面是一个三行解决方案,对我来说快了10倍以上:首先有效地复制集合:
_id
db.collection.aggregate([{ $out: "collection_copy" }]);
字符串现在将文档从副本传递回原始文档,但删除_id字段,从而生成新的_id:
db.collection_copy.aggregate([{$project: {_id: 0}}, { $merge: "collection" }]);
型最后,清理副本:
db.collection_copy.drop();
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)
vmjh9lq98#
用管道
db.collection.insertMany( db.collection.aggregate([ { $match: { _id: ObjectId("") } }, { $unset: [ "_id"] }]).toArray());
8条答案
按热度按时间9njqaruj1#
只需更改ID并重新插入。
字符串
ldioqlga2#
您可以为副本Document给予新的ObjectId。在mongo shell里
字符串
xfyts7mz3#
对@689响应的一点改进
字符串
6gpjuf904#
你可以使用下面的代码:
单线运行:
字符串
理解的结构格式:
型
b4qexyjb5#
在mongo shell中:没关系
字符串
6fe3ivhb6#
前面的许多答案都很简单和正确,但是如果您的目标是用新的
_id
复制集合中的所有文档,那么这些答案就没有效率了。下面是一个三行解决方案,对我来说快了10倍以上:首先有效地复制集合:
字符串
现在将文档从副本传递回原始文档,但删除
_id
字段,从而生成新的_id
:型
最后,清理副本:
型
zbwhf8kr7#
单线
字符串
结构化
型
vmjh9lq98#
用管道
字符串