换下风格^_^

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

数据库 admin 813℃ 0评论

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

喜欢 (2)
捐助本站极豆博客全站无广告。如果您觉得本博客的内容对您小有帮助,可以对我小额赞助,您的赞助将用于维持博客运营。

极豆博客

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址