参考文章:
线上项目使用单机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 小于等于(<=)
网友评论