是否有可能mongodump集合中的最后一个"x"记录?

Mic*_*ash 29 mongodb

你能用mongodump从集合中转储最新的"x"文件吗?例如,在mongo shell中,您可以执行:

db.stats.find().sort({$natural:-1}).limit(10);
Run Code Online (Sandbox Code Playgroud)

mongodump可以使用相同的功能吗?

我想解决方法是将上述文档转储到一个新的临时集合中并mongodump整个临时集合,但是能够通过mongodump实现这一点非常棒.

提前致谢,

迈克尔

Mic*_*c92 44

mongodump没有完全公开游标接口.但是你可以使用--query参数解决它.首先获取集合的文档总数

db.collection.count()
Run Code Online (Sandbox Code Playgroud)

假设有10000个文档,你想要最后的1000个.这样做得到你想要转储的第一个文件的id.

db.collection.find().sort({_id:1}).skip(10000 - 1000).limit(1)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,id是"50ad7bce1a3e927d690385ec".现在,您可以mongodump使用此信息提供,以转储具有更高或相同ID的所有文档.

$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gte: ObjectId("50ad7bce1a3e927d690385ec")}}'
Run Code Online (Sandbox Code Playgroud)

UPDATE 新的参数--limit--skip添加到mongoexport会可能提供该工具的下一个版本:https://github.com/mongodb/mongo/pull/307

  • `db.collection.find().sort({_ id:-1}).skip(1000).limit(1)`也可以完成这个技巧,并且你不需要迭代所有以前的记录. (2认同)

Bre*_*Nee 5

根据Mic92的答案,从集合中获取最新的1000件商品:

找到_id第1000个最新商品:

db.collection.find('', {'_id':1}).sort({_id:-1}).skip(1000).limit(1)

它会像50ad7bce1a3e927d690385ec

然后在查询中将此_id传递给mongodump:

$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gt: ObjectId("50ad7bce1a3e927d690385ec")}}'

  • 小修正:此代码转储 1001 条记录。您可以将 $gte 替换为 $gt。 (2认同)