堕落不振功业废,勤耕不辍日月新

通过ObjectId按照时间筛选备份mongo

Mongodb hailen 557℃

给你个任务:备份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

喜欢 (0)or分享 (0)