如何使用mongodump转储与特定日期范围匹配的记录?

Sim*_*son 49 mongodb

我正在尝试使用mongodump命令转储在特定日期创建的一堆记录.记录包括一个"ts"字段,它是一个MongoDB Date()对象.

mongodump采用-q参数,该参数可用于运行查询以选择要包含在转储中的记录.不幸的是,-q参数需要在JSON中提供,并且不清楚如何在纯JSON中表达"少于此日期,超过此日期"的查询(通常这样的查询将使用' new Date()'constructor)"

有小费吗?我已经尝试使用{$ date:unix-timestamp-in-milliseconds}格式,但它对我不起作用.

Sim*_*son 59

我解决了 - 我正在寻找的神奇咒语是:

mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}"
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过将其包装在单引号中来转义json. (3认同)
  • 不要害怕接受这个作为答案,为我工作 - 没有意识到我必须逃避美元符号. (2认同)

eri*_*oco 27

比@ SimonWillison的转义版更人性化的版本:

--query "{ time: { \$gt: new Date(1312959600000), \$lt: new Date(1313046000000) }}"

(注意,仍然需要转义美元符号.)

我通过在shell中创建日期来获得毫秒时间戳,例如:

> var targetDateStart = new Date(2011, 7, 10);
> var targetDateEnd = new Date(2011, 7, 11);
> targetDateStart.getTime();
1312959600000
> targetDateEnd.getTime();
1313046000000
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用单引号`'`,```不需要被转义.事实上这是推荐的方式,'{time:{$ gt:new Date(1312959600000),$ lt:new Date(1313046000000)}}'` (9认同)

dig*_*ang 18

在MongoDB 3.2中,我们可以使用--queryFilemongodump选项.

首先,创建一个json文件:

//query.json
{"serverTime": {"$gte": ISODate("2016-01-30T16:00:00.000Z"), "$lt": ISODate("2016-01-31T16:00:00.000Z")}}
Run Code Online (Sandbox Code Playgroud)

接下来,使用mongodump:

mongodump --db <dbName> --collection <collectionName> --queryFile query.json
Run Code Online (Sandbox Code Playgroud)

简单明了.


ify*_*ndy 9

编辑:修正错别字

添加更新:

  1. mongodump --query不支持IsoDate,但Date以毫秒形式接受.

  2. 由于dateOS X中的命令行为不同,date -d 2011-08-10 +%s因此对我不起作用.如果您遇到同样的问题,请尝试阅读手册或使用:

  3. 使用单引号版本以避免转义.

    mongodump --query '{updated_at: { $gte: Date(1403280000000) } }'
    
    Run Code Online (Sandbox Code Playgroud)


Rem*_*iet 5

这应该可以,关于$ date查询,什么不起作用?:

mongodump --query  {"ts":{$gt:{$date:178929000}}}
Run Code Online (Sandbox Code Playgroud)


mcr*_*mcr 5

在查询周围使用单引号。我发现 ISODate() 不起作用。

mongodump --query  '{"ts":{$gt:{$date:178929000}}}'
Run Code Online (Sandbox Code Playgroud)


rSt*_*rms 5

扩展 JSON 格式有效,可以在文档 ( https://docs.mongodb.com/database-tools/mongodump/ ) 中找到。例子:

--query '{ "timest": { "$gte": { "$date": "2020-08-19T00:00:00.000Z" } } }'