使用mongoexport命令的日期范围

时间:2014-09-08 21:13:06

标签: mongodb mongoexport

在我的mongo数据库中,我有这种格式的数据

{ "_id" : { "$oid" : "53179b7f036457ea7fff00a7" }, "act" : "browserInfo", "creAt" : { "$date" : "2014-03-05T16:47:43.845-0500" }}

我试图想出一个shell脚本,使用下面的脚本导出具有给定日期范围的条目(我将其命名为csv_from_mongo_collection.sh)

#!/bin/bash
db_name=$1
collection=$2
output_file=$3

for i in "$@"
do
case $i in
    --from=*)
    from="${i#*=}"
    shift
    ;;
    --to=*)
    to="${i#*=}"
    shift
    ;;
esac
done

query="{creAt:{$gte:new Date($from),$lt:new Date($to)}}";

mongoexport --db "$db_name" --collection "$collection" --out "$output_file" --query "$query"

当我运行以下命令时,我看到上传指定集合中的所有条目都忽略了我设置的日期范围。

csv_from_mongo_collection.sh mydb analytics analytics_content.json --from=01/01/2013 --to=12/01/2013

有人可以帮我修复我的脚本/命令吗?谢谢

2 个答案:

答案 0 :(得分:1)

问题出在query="{creAt:{$gte:new Date($from),$lt:new Date($to)}}";

如何处理$gte$lt?由于变量未定义? ($ from定义):)

new Date("01/01/2013")是正确的,但不是new Date(01/01/2013)

使用单引号'生成查询文档。

答案 1 :(得分:0)

通过使用双引号(")创建查询,查询字符串中所有带有$前缀的单词都将被视为变量。因为$word是bash变量。 我在查询字符串中标记了所有变量:

query="{creAt:{$gte:new Date($from),$lt:new Date($to)}}";
               ^^^^          ^^^^^  ^^^          ^^^

您可以看到,不仅$from$to是变量,而且$gte$lt也被视为变量!那么如何将日期存储在字符串中,同时又符合查询语法?

使用转义字符\来对查询字符串中的\$进行转义。现在,$的符号将不会被视为变量的使用!下面的示例。

query="{creAt:{\$gte:new Date($from),\$lt:new Date($to)}}";