要完成上述引言里的需求,我们这里从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命令脚本语法如下:
>mongodump -h dbhost -d dbname -o dbdirectory-h:
MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:
需要备份的数据库实例,例如:test
-o:
备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
mongodump的例子:
$MONGO_HOME/bin/mongodump --port 37218 -d dbname -q '{"_id":{$gte:ObjectId("56742d800000000000000000")}}' -o ~/backup
注:上面ObjectId(“56742d800000000000000000”)可再上面mongo shell 调用objectIdWithTimestamp函数获得
MongoDB数据恢复
mongodb使用 mongorerstore 命令来恢复备份的数据。
语法
mongorestore命令脚本语法如下:
>mongorestore -h dbhost -d dbname --directoryperdb dbdirectory-h:
MongoDB所在服务器地址
-d:
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--directoryperdb:
备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,而不是备份时候的dump,读者自己查看提示吧!
--drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
接下来我们执行以下命令:
>mongorestore