给你个任务:备份mongo某个库里的所有表数据。这是一个很简单的任务mongodump -d 就ok了。但是我们限定只备份最近几天或者某日之后的数据时,而且我们假设该库里某些表没有保存时间字段,或者时间字段名字不统一。那你改怎么做呢?本文就是探讨如何实现该需求。
要完成上述引言里的需求,我们这里从mongo的ObjectId入手,我们知道ObjectId的前四个字节是时间戳,那么我们可以在mongodump -q 来筛选记录。如果你不了解mongo ObjectId的构造请参看《_id和ObjectId》。
首先我们的使用场景是输入一个时间格式,然后返回该时间的最小ObjectId值,然后只要
在MongoDB shell中运行:
function objectIdWithTimestamp(timestamp) { // Convert string date to Date object (otherwise assume timestamp is a date) if (typeof(timestamp) == 'string') { timestamp = new Date(timestamp); } // Convert date object to hex seconds since Unix epoch var hexSeconds = Math.floor(timestamp/1000).toString(16); // Create an ObjectId with that hex timestamp var constructedObjectId = ObjectId(hexSeconds + "0000000000000000"); return constructedObjectId }
然后调用上面定义的函数:
db.collectionName.find({ _id: { $lt: objectIdWithTimestamp('2015/10/01') } })
注:上面collectionName替换成你需查询的collection名字。
mongodump的例子:
$MONGO_HOME/bin/mongodump --port 37218 -d dbname -q '{"_id":{$gte:ObjectId("56742d800000000000000000")}}' -o ~/backup
注:上面ObjectId(“56742d800000000000000000”)可再上面mongo shell 调用objectIdWithTimestamp函数获得。
转载请注明:极豆技术博客 » 通过ObjectId按照时间筛选备份mongo
转载请注明:我是IT » 通过ObjectId按照时间筛选备份mongo