Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 是否可以将最后一个“mongodump”;x";收藏的唱片?_Mongodb - Fatal编程技术网

Mongodb 是否可以将最后一个“mongodump”;x";收藏的唱片?

Mongodb 是否可以将最后一个“mongodump”;x";收藏的唱片?,mongodb,Mongodb,能否使用mongodump从集合中转储最新的“x”文档?例如,在mongo shell中,您可以执行: db.stats.find().sort({$natural:-1}).limit(10); mongodump是否可以使用相同的功能 我想解决办法是将上述文档转储到一个新的临时集合中,然后mongodump处理整个临时集合,但是如果能够通过mongodump完成这项工作,那就太好了 提前感谢, 迈克尔。如果您可以将查询指定为json查询,那么您应该能够做到这一点 如果没有,那么运行查询将记

能否使用mongodump从集合中转储最新的“x”文档?例如,在mongo shell中,您可以执行:

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版本等)