将MongoDB集合的子集保存到另一个集合

Sem*_*Fly 59 mongodb

我有这样的一套

{date: 20120101}
{date: 20120103}
{date: 20120104}
{date: 20120005}
{date: 20120105}
Run Code Online (Sandbox Code Playgroud)

如何将日期为"20120105"的那些文档的子集保存到另一个集合中?

db.subset.save(db.full_set.find({date: "20120105"}));

小智 83

作为一个更新的解决方案,我建议使用聚合框架来解决问题:

db.full_set.aggregate([ { $match: { date: "20120105" } }, { $out: "subset" } ]);

至少在我的情况下,它比forEach快100倍.这是因为整个聚合管道在mongod进程中运行,而解决方案基于find()并且insert()必须将所有文档从服务器发送到客户端然后再返回.即使服务器和客户端在同一台计算机上,这也会降低性能.

  • 警告.这是一个非常危险的命令.它将删除"子集"集合中的任何内容. (15认同)
  • $ out对文档大小没有通常的限制,因为你正在写一个集合 (5认同)
  • 为了澄清@zhaokongsheng的评论,如果`$ out`集合已经存在"......`$ out`阶段用新结果集合原子地替换现有集合." `$ out`不会附加到现有的集合中.请参阅https://docs.mongodb.com/manual/reference/operator/aggregation/out/ (5认同)

Eve*_*man 63

这是shell版本:

db.full_set.find({date:"20120105"}).forEach(function(doc){
   db.subset.insert(doc);
});
Run Code Online (Sandbox Code Playgroud)

注意:从MongoDB 2.6开始,聚合框架可以更快地完成此任务; 详见梅兰的答案.

  • 截至[2.2](http://docs.mongodb.org/manual/reference/method/db.collection.insert/),insert可以获取一系列文档,因此您可以执行`var docs = ... find (...)指定者().db.coll.insert(文档)`.不过,在任何一种情况下,我都没有发现表现非常好 (6认同)

小智 17

实际上,insert into ... select fromMongoDB中有一个等价的SQL .首先,将多个文档转换为文档数组; 然后将数组插入目标集合

db.subset.insert(db.full_set.find({date:"20120105"}).toArray())
Run Code Online (Sandbox Code Playgroud)


小智 16

最通用的解决方案是:

利用聚合(@melan给出的答案):

db.full_set.aggregate({$match:{your query here...}},{$out:"sample"})
db.sample.copyTo("subset")
Run Code Online (Sandbox Code Playgroud)

即使在操作之前存在"子集"中的文档并且您希望保留这些"旧"文档并只是在其中插入新子集时,这也可以工作.

必须小心,因为copyTo()命令用相同的文件替换文档_id.