MongoDB 实现 MySQL 的 INSERT INTO SELECT

alt

说金钱是罪恶,都在捞;说美女是祸水,都想要;说高处不胜寒,都在爬;说烟酒伤身体,都不戒;说天堂最美好,都不去!

原因

公司业务有要将一个集合需要更改名称,需要DBA做配合

操作流程

  1. 停止入库
  2. 确认已经把库入数据审完
  3. 重命名collections
  4. 创建新集合索引
    db.antispam_resource.renameCollection("antispam_resource_20190415");
    db.createCollection("antispam_resource");
    db.antispam_resource.ensureIndex({createTs: 1, groupId: 1});
    db.antispam_resource.ensureIndex({handleTs: 1, opUserId: 1});
    db.antispam_resource.getIndexes();
  5. 新数据入库
  6. 看审核后台是否有新数据入库并审核
  7. 把最近1个月数据(antispam_resource_20190415)导入到antispam_resource
  8. 完毕

操作

查看一下原集合数据量

1
db.antispam_resource.find().count();

进行更改名称操作

1
db.antispam_resource.renameCollection("antispam_resource_20190415")

进行创建索引

1
2
3
db.antispam_resource.ensureIndex({createTs: 1, groupId: 1});
db.antispam_resource.ensureIndex({handleTs: 1, opUserId: 1});
db.antispam_resource.getIndexes();

进行操作 MongoDB 版本的 INSERT INTO SELECT

1
2
3
4
5
示例:
db.antispam_resource.find().forEach(function(doc){
print(doc._id);
db.antispam_resource.insert(doc)}
);

操作详细步骤

查看原集合大于4月1号的数据

1
2
3
4
5
6
7
8
9
10
11
12
mgset-11469021:PRIMARY> db.antispam_resource_20190415.find({createTs: { $gte: NumberLong(1554048000) }}).count()
2726271
mgset-11469021:PRIMARY> db.antispam_resource_20190415.find({createTs: { $lte: NumberLong(1554048000) }}).count()
22264682
mgset-11469021:PRIMARY> db.antispam_resource.find().count()
27824
mgset-11469021:PRIMARY> db.antispam_resource.find({ createTs: { $gte: NumberLong(1554048000) }}).count()
27861
mgset-11469021:PRIMARY> db.antispam_resource.find({ createTs: { $lte: NumberLong(1554048000) }}).count()
0
mgset-11469021:PRIMARY> db.antispam_resource.find({ createTs: { $gte: NumberLong(1554048000) }}).count()
28074

进行操作

1
2
mgset-11469021:PRIMARY> var docs = db.antispam_resource_20190415.find({createTs: { $gte: NumberLong(1554048000) }});
mgset-11469021:PRIMARY> docs.forEach( function(d){ db.antispam_resource.insert(d) });

数据在慢慢插入到新的集合中

1
2
3
4
mgset-11469021:PRIMARY> db.antispam_resource_20190415.find({createTs: { $gte:1554048000, $lte:1555311600}}).count()
2726271
mgset-11469021:PRIMARY> db.antispam_resource.find({createTs: { $gte:1554048000, $lte:1555311600}}).count()
2726271

终于导完

-------------本文结束感谢您的阅读-------------

本文标题:MongoDB 实现 MySQL 的 INSERT INTO SELECT

文章作者:Wang Jiemin

发布时间:2019年04月15日 - 17:04

最后更新:2019年04月15日 - 19:04

原始链接:https://jiemin.wang/2019/04/15/mongodb-inset-into-select/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%