我有这样的一套
{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()
必须将所有文档从服务器发送到客户端然后再返回.即使服务器和客户端在同一台计算机上,这也会降低性能.
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开始,聚合框架可以更快地完成此任务; 详见梅兰的答案.
小智 17
实际上,insert into ... select from
MongoDB中有一个等价的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
.
归档时间: |
|
查看次数: |
54696 次 |
最近记录: |