【问题标题】:How can I use mongodump to dump out records matching a specific date range?如何使用 mongodump 转储匹配特定日期范围的记录?
【发布时间】:2011-10-23 05:51:43
【问题描述】:

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

mongodump 采用 -q 参数,可用于运行查询以选择要包含在转储中的记录。不幸的是, -q 参数需要在 JSON 中提供,并且不清楚如何在纯 JSON 中表达“小于此日期,大于此日期”查询(通常此类查询将使用 ' new Date()' 构造函数)"

有什么建议吗?我试过使用 {$date: unix-timestamp-in-milliseconds} 格式,但它不适合我。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    这应该有效,您的 $date 查询有什么问题? :

    mongodump --query  {"ts":{$gt:{$date:178929000}}}
    

    【讨论】:

    【解决方案2】:

    我解决了——我正在寻找的魔法咒语是:

    mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}"
    

    【讨论】:

    • 不要害怕接受这个作为答案,为我工作 - 没有意识到我必须逃避美元符号。
    • 您在此处使用的 JSON 格式的日期是否有文档? `date -d 2011-08-10 +%s`000 是什么意思?
    • @ericsoco 看起来他正在运行一个 shell 命令来生成日期
    • 也为我工作。它可能不像其他解决方案那样具有人类可读性,但与 13 位数字相比,日期部分是人类可读性最强的部分,您每次都应该使用它!谢谢西蒙。
    • 您可以通过将 json 包裹在单引号中来对其进行转义。
    【解决方案3】:

    比@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
    

    【讨论】:

    • $ 如果使用单引号',则不需要转义。事实上这是推荐的方式,'{ time: { $gt: new Date(1312959600000), $lt: new Date(1313046000000) }}'
    【解决方案4】:

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

    mongodump --query  '{"ts":{$gt:{$date:178929000}}}'
    

    【讨论】:

    • 单引号确实必不可少(令人惊讶),谢谢!
    【解决方案5】:

    编辑:修正错别字

    添加更新:

    1. mongodump --query 不支持IsoDate,但接受以毫秒为单位的Date

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

      • 以秒为单位获取当前时间:

        date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
        
      • 以秒为单位获取特定时间:

        date -j -f "%Y-%m-%d %H:%M:%S" "2014-01-01 00:00:00"  "+%s"
        
    3. 使用单引号版本避免转义。

      mongodump --query '{updated_at: { $gte: Date(1403280000000) } }'
      

    【讨论】:

    • 第一个命令 Failed conversion of ``Mar 15 sep 2015 10:49:19 CEST'' using format ``%a %b %d %T %Z %Y'' 第二个命令给了我与 javascripts Date.UTC(...) / 1000 相同但与 ISODate(...).getTime() / 1000 不同(2 小时,因为我在法国)
    • 它没有括号。正确的语法是:mongodump --query '{updated_at: { $gte: Date(1403280000000) } }'
    【解决方案6】:

    在 MongoDB 3.2 中,我们可以在 mongodump 中使用 --queryFile 选项。

    首先,创建一个json文件:

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

    接下来,使用 mongodump:

    mongodump --db <dbName> --collection <collectionName> --queryFile query.json
    

    简单明了。

    【讨论】:

    • 我也有同样的问题,需要使用 new Date 而不是 ISODate //query.json {"serverTime": {"$gte": new Date("2016-01-30T16:00 :00.000Z"), "$lt": 新日期("2016-01-31T16:00:00.000Z")}}
    【解决方案7】:

    在我的例子中,我查询了 14 天前创建的条目并最终得到了这个 bash 脚本:

    #!/bin/bash
    date_now=`date +%s%3N`
    date_2weeks_ago=$[date_now - 14 * 24 * 60 * 60 * 1000]
    query=$(printf '{ createdAt: { $gte: Date(%d) } }' $date_2weeks_ago)
    echo $query > query.json
    mongodump \
    --collection=data \
    --queryFile=query.json
    rm query.json
    

    mongodump 版本:r4.0.12

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多