如何将mongoexport与查询脚本文件一起使用

lio*_*ior 2 mongodb mongoexport

我正在尝试按照本教程:http://www.ultrabug.fr/tag/mongoexport/

并使用sh文件作为查询行.这是我的档案:

#!/bin/bash
d=`date --date="-3 month"`
echo "{ timeCreated: { "\$lte": $d} }"
Run Code Online (Sandbox Code Playgroud)

这是我的mongoexport行:

 mongoexport --db game_server --collection GameHistory -query /home/dev/test2.sh --out /home/dev/file.json
Run Code Online (Sandbox Code Playgroud)

我一直在:

assertion: 16619 code FailedToParse: FailedToParse: Expecting '{': offset:0 of:/home/dev/test2.sh
Run Code Online (Sandbox Code Playgroud)

为什么?我怎样才能做到这一点?

Leo*_*tny 10

我在你的方法中发现了几个错误,让我们一个一个地检查它们.

日期格式

MongoDB期望date为数字或ISO 8601字符串.

不幸的是,unix date实用程序没有对此格式的内置支持,因此您应该使用:

d=`date --date="-3 month" -u +"%Y-%m-%dT%H:%M:%SZ"`
Run Code Online (Sandbox Code Playgroud)

使用扩展的JSON

JSON规范不支持日期,因此您应该使用MongoDB扩展JSON.因此,您的最终查询应如下所示:

{ "timeCreated": { "$lte": { "$date": "2014-05-12T08:53:29Z" } } }
Run Code Online (Sandbox Code Playgroud)

test.sh 产量

你搞砸了引号.这是一个脚本示例,输出正确的JSON:

#!/bin/bash
d=`date --date="-3 month" -u +"%Y-%m-%dT%H:%M:%SZ"`
echo '{ "timeCreated": { "$lte": { "$date": "'$d'" } } }'
Run Code Online (Sandbox Code Playgroud)

将查询传递给 mongoexport

mongoexport期望--query是一个JSON字符串,而不是.sh脚本.因此,当您传递文件路径时--query,mongoexport期望它是一个JSON文件.

要修复它,你应该test2.sh自己执行并将结果字符串传递给mongoexport:

mongoexport --db game_server --collection GameHistory \
  --query "`./test2.sh`" --out ./test2.json
Run Code Online (Sandbox Code Playgroud)

NB注意电话"周围的引号./test2.sh.他们告诉bash将./test2.sh输出视为单个参数,忽略所有内部引号和空格.