Mongodb 是否可以将最后一个“mongodump”;x";收藏的唱片?
能否使用mongodump从集合中转储最新的“x”文档?例如,在mongo shell中,您可以执行:Mongodb 是否可以将最后一个“mongodump”;x";收藏的唱片?,mongodb,Mongodb,能否使用mongodump从集合中转储最新的“x”文档?例如,在mongo shell中,您可以执行: db.stats.find().sort({$natural:-1}).limit(10); mongodump是否可以使用相同的功能 我想解决办法是将上述文档转储到一个新的临时集合中,然后mongodump处理整个临时集合,但是如果能够通过mongodump完成这项工作,那就太好了 提前感谢, 迈克尔。如果您可以将查询指定为json查询,那么您应该能够做到这一点 如果没有,那么运行查询将记
db.stats.find().sort({$natural:-1}).limit(10);
mongodump是否可以使用相同的功能
我想解决办法是将上述文档转储到一个新的临时集合中,然后mongodump处理整个临时集合,但是如果能够通过mongodump完成这项工作,那就太好了
提前感谢,
迈克尔。如果您可以将查询指定为json查询,那么您应该能够做到这一点
如果没有,那么运行查询将记录转储到临时集合中,然后再进行转储的技巧就可以了。在这种情况下,您可以使用shell脚本自动转储,该脚本使用javascript命令调用mongo,然后调用mongodump。
mongodump
不会完全公开游标接口。
但是您可以使用--query
参数来解决这个问题。
首先获取集合的文档总数
db.collection.count()
假设有10000个文档,您想要最后1000个。
为此,获取要转储的第一个文档的id
db.collection.find().sort({_id:1}).skip(10000 - 1000).limit(1)
在此示例中,id为“50ad7bce1a3e927d690385ec”。
现在,您可以将此信息输入mongodump
,以转储id更高或相等的所有文档
$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gte: ObjectId("50ad7bce1a3e927d690385ec")}}'
更新
新参数
--limit
和--skip
已添加到mongoexport
中,该工具的下一个版本可能会提供这些参数:我正在处理一个类似的需求(使用mongodump),我想在其中执行顺序备份和恢复。我将从上次存储的时间戳中提取转储。
我无法通过--查询“{TIMESTAMP:{$gte:$stime,$lt:$etime}”
需要注意的几点:
1) 使用单引号而不是双引号
2) 不要逃避美元或任何东西
3) 用实数替换$stime/$etime将使查询工作
4) 我遇到的问题是在mongodump执行之前解决了$stime/$etime
在-x下显示为
+eval mongodump--查询“{TIMESTAMP:{\$gte:$utc\u stime,\$lt:$utc\u etime}”
++mongodump--查询“{TIMESTAMP:$gte:1366700243}”{TIMESTAMP:$lt:1366700253}”
见鬼,问题很明显。查询被转换为两个条件
这个解决方案很棘手,我经过反复试验后得到了。。。。
转义{和}即使用{..}。这解决了问题。根据Mic92的答案,从集合中获取最近的1000项: 查找最近第1000项的
\u id
:
db.collection.find(“”,{u-id':1}).sort({u-id:-1}).skip(1000).limit(1)
它将类似于50ad7bce1a3e927d690385ec
然后在查询中将此_id传递给mongodump:
$mongodump-d'your_database'-c'your_collection'-q'{“\u id”:{“$gt”:{“$oid”:“50ad7bce1a3e927d690385ec”}}}}
试试这个:
NUM=10000
doc=selected_doc
taskid=$(mongo 127.0.0.1/selected_db -u username -p password --eval "db.${doc}.find({}, {_id: 1}).sort({_id: -1}).skip($NUM).limit(1)" | grep -E -o '"[0-9a-f]+"')
mongodump --collection $doc --db selected_db --host 127.0.0.1 -u username -p password -q "{_id: {\$gte: $taskid}}" --out ${doc}.dump
如果为您的收藏使用自定义的
\u id
,则基于\u id
的方法可能不起作用(例如,由第三方API返回)。在这种情况下,您应该依赖于createdAt
或等效字段:
COL=“collectionName”
多少=10000
DATE_CUTOFF=$(mongo dbname--安静\
--eval“db.$COL.find({},{createdAt:1}).sort({createdAt:-1}).skip($HOW_MANY).limit(1)”\
|grep-E-o'(ISODate\(.*?\)')
echo“在$DATE\u截止日期之后复制$HOW\u个项目…”
mongodump-d dbname-c${COL}\
-q“{createdAt:{\$gte:$DATE_CUTOFF}}”-gzip
没错,mongodump程序将允许查询,但不允许您添加限制。谢谢你确认我的第二逻辑,这就是我最后所做的。非常聪明的回答。。。不错db.collection.find().sort({u id:-1}).skip(1000).limit(1)
也能起到作用,并且有一个额外的好处,您不需要遍历所有以前的记录。如果您使用的是4.2Like@dtc,那么您需要使用{“$oid”:…}
而不是ObjectId(…)
,或者您可能会得到错误解析查询作为扩展JSON:invalid JSON input
。类似的要求,但我希望每个集合都有最新的n条记录来设置开发/测试服务器。次要修复:此代码转储1001条记录。您可以将$gte替换为$gt。我获取的失败:将查询解析为扩展JSON时出错:JSON输入无效
,必须将查询更改为:-q'{“{u id”:{“$gte”:{“$oid”:“50ad7bce1a3e927d690385ec”}}}
-{“$oid…”
,而不是使用ObjectId(…)
直接。Good catch@Qtax-看起来新版本的mongo的语法稍有不同,所以我更新了答案。mongo
行可以通过传递quiet
来改进,以消除各种mongo警告(不同的shell版本等)