【问题标题】:MongoDB - mongodump collections with a limitMongoDB - 有限制的 mongodump 集合
【发布时间】:2019-10-18 23:06:04
【问题描述】:

有没有办法 mongodump 一个包含 10 多个集合的数据库并获取每个集合中的最后 100 个对象?

这是我一直在训练的,但它不起作用:

mongodump --gzip --uri="mongodb://$IP:$PORT/$DB" \
    --collection=$COLLECTION  \
    --archive=$COLLECTION.gz \
    --query="{ \"\$limit\": 100 }"

这是输出:

Failed: (command failure) Can't canonicalize query: BadValue unknown top level operator: $limit

我真的需要查询限制才能工作,因为一些集合有 5gb 的数据,我只是为了本地开发目的而运行它,所以我只需要数据库中实际内容的一小部分样本集/收藏

对此的任何帮助将不胜感激!

更新:

我的对象有一个 unix timestamp 字段,我将查询切换到此,但仍然没有成功:

// Attempt #2
-q='{"timestamp": { "$gt": "1569888896" }}'

// Attempt #3
-q='{"timestamp":{"$gte": [{ "$toDate": "$timestamp"}, "ISODate(2016-01-01T00:00:00.000Z)"]}}'

在这些情况下没有错误,但它不断传回 0 个对象!

【问题讨论】:

    标签: mongodb shell docker mongoose mongodb-query


    【解决方案1】:

    您可以尝试使用具有排序和限制选项的 mongoexport 和 mongoimport,它们比 mongodump 相对慢,因为您只需要 100 个对象就可以了。

    mongoexport -h $HOST 
      -u $USERNAME 
      -p $PASSWORD 
      -d $DATABASE 
      -c $COLLECTION 
      -q '{}' 
      --sort '{_id: -1}' 
      --limit 100 
      -o $COLLECTION.csv
    

    【讨论】:

    • 我看到了这个,但遗憾的是这不起作用,因为它不允许存档,尽管我可能没有存档可以做,所以我会看到
    【解决方案2】:

    我能够得到一些工作,虽然不理想..

    如果我在 unix-timestamp 中硬编码不带引号,它可以工作,并且查询本身必须用单引号括起来。

    --query '{ "timestamp" : { "$gt" : 1569890129 } }'
    

    来源: https://docs.mongodb.com/manual/reference/program/mongodump/#cmdoption-mongodump-query

    您必须将查询文档用单引号 ('{ ... }') 括起来,以确保它不会与您的 shell 环境交互。

    【讨论】:

    • 如果可能的话,仍然希望能够抓住最后 100 个。如果有办法,请发布您的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多