0

我试图转储自每天午夜以来在 MongoDB 中创建的所有条目。我创建了一个使用 'mongoexport' 实用程序的 unix 脚本。它返回零记录。以下是命令。

# Generate a variable that stores today's date and 00:00 hours in epoch format
toDay=$(date +%Y-%m-%d)
todayMidnightEpoch=$(date -d "${toDay} 00:00:00" "+%s")

# Now plug this epoch variable into mongoexport command
mongoexport \
--host <hostname> \
--username <user ID> \
--password <password> \
--db <db name> \
--limit 100000 \
--collection <collection name> \
--out filename-$(date +%Y%m%d).json \
--query '{created_at:{"$gte": "new Date(${todayMidnightEpoch})"}}'
  1. 我在 CentOS+MongoDB 服务器上运行这个脚本。
  2. 我在没有查询选项的情况下测试了 mongoexport 命令,几乎立即获得了所有文档的输出。

跑步超过 10-20 分钟后,我得到零记录。当我在 Mongo Shell 上运行相同的“查询”并将变量替换为实际纪元值时,我会立即得到正确的输出。

db.<collection name>.find('{"created_at":{"$gte":new Date(140013360000000)}}')

即使我在 mongoexport 命令中硬编码 epoch 值,我也得到了一条记录。

mongoexport --host <hostname> --username <username> --password <password> --db <db name> --limit 10 --collection <coll name> --out test-$(date +%Y%m%d).json --query '{created_at:{$gte:new Date(1431561600000)}}'

问题:

  • 为什么在 mongo shell 中使用硬编码的 epoch 值运行查询时返回记录(或文档),但在通过 mongoexport 实用程序中的 unix 变量传递时却不返回?
  • 有没有办法在查询选项中将今天的日期和时间指定为 00:00:00 而无需将其转换为纪元格式?
4

1 回答 1

3

您需要像这样修改您的纪元时间:

newtodayMidnightEpoch=$(($todayMidnightEpoch*1000))

您需要将查询行更改为:

--query "{created_at:{\"\$gte\": new Date(${newtodayMidnightEpoch})}}"

您需要在整个字符串周围使用双引号而不是单引号,因为单引号会防止变量替换,然后您需要删除 new Date( 字符串周围的双引号,因为它的语法不正确。您还需要以毫秒为单位传递纪元而不是秒。当我进行更改并用反斜杠转义 $gte 周围的双引号时,它对我来说很好。

所以完整的新脚本将是:

# Generate a variable that stores today's date and 00:00 hours in epoch format
toDay=$(date +%Y-%m-%d)
todayMidnightEpoch=$(date -d "${toDay} 00:00:00" "+%s")
newtodayMidnightEpoch=$(($todayMidnightEpoch*1000))


# Now plug this epoch variable into mongoexport command
mongoexport \
--host <hostname> \
--username <user ID> \
--password <password> \
--db <db name> \
--limit 100000 \
--collection <collection name> \
--out filename-$(date +%Y%m%d).json \
--query "{created_at:{\"\$gte\": new Date(${newtodayMidnightEpoch})}}"
于 2014-05-16T01:07:09.080 回答