mongodump按日期导出数据

参考文章:

  • MongoDB 日期查询与mongodump 按日期范围导出数据
  • mongodump按照日期时间范围导出数据
  • Mongodb完全使用教程

线上项目使用单机mongodb存储数据,由于每次导出需要先去加密,因为每次导出的数据不能太多,这里利用mongodump按照时间条件查询数据
官网看了相关文档,不过没看懂,,解决问题就行了,剩下的交给DBA

mongodb查询时间戳可使用Date和ISODate两种方式

Date

如果我想要取2017.3到2017.6的数据条数:

db.session_1.find({"timestamp":{$gte:new Date(2017,3,1)},"timestamp":{$lte:new Date(2017,6,1)}}).count()

不过我发现用Date卡时间不管用,可能是库里数据的问题,只支持ISODate

ISODate

查询大于等于北京时间2017.9.1 凌晨的数据记录,也就是2017.9.1 凌晨至今的数据记录。ISODate指的是标准时间,东八时区相差8小时

db.session_1.find({"timestamp":{$gte:ISODate("2017-09-01T16:00:00Z")}}).count()

mongodump按日期导出数据

mongodump 的--query-q选项可以指定查询范围,但不支持ISODate格式:

root@doushuo-virtual-machine:~# mongodump --port 27017 -d my_db -c my_collection -q '{"timestamp":{$gte:ISODate("2017-06-01T16:00:00Z")}}' -o test
connected to: 127.0.0.1:27017
assertion: 16619 code FailedToParse: FailedToParse: Bad characters in value: offset:19
root@doushuo-virtual-machine:~#

将时间戳转换为毫秒:

root@doushuo-virtual-machine:~# date -d 2017-06-01 +%s
1496246400

毫秒补三个0,即可正常导出:

root@doushuo-virtual-machine:~# mongodump --port 27017 -d my_db -c my_collection -q '{"timestamp":{$gte:Date(1496246400000)}}' -o test
connected to: 127.0.0.1:27017
Thu Dec 28 00:38:13.846 DATABASE: my_db  to     test/my_db
Thu Dec 28 00:38:13.870     my_db.my_collection to test/my_db/my_collection.bson
Thu Dec 28 00:38:17.155         Collection File Writing Progress: 10000/1079657 0%  (objects)
Thu Dec 28 00:38:20.009         Collection File Writing Progress: 26400/1079657 2%  (objects)
Thu Dec 28 00:38:23.010         Collection File Writing Progress: 46000/1079657 4%  (objects)

mongodb条件操作符

用于比较表达式的值,从库中取数据:

  • $gt 大于(>)
  • $lt 小于(<)
  • $gte 大于等于(>=)
  • $lte 小于等于(<=)

你可能感兴趣的:(mongodump按日期导出数据)