Mongodb 在bash中使用for循环迭代jq的输出

Mongodb 在bash中使用for循环迭代jq的输出,mongodb,bash,jq,Mongodb,Bash,Jq,各位开发者好 我在这件事上有点困难,所以你的帮助会很好:) 我正在创建一个脚本shell,它将定期(多亏了cron)在脱机mongodb和firebase之间执行同步 我过去常常处理mongodb的导出,但这一个在包含空格的字符串值上表现得很奇怪 例如,我从名为users(使用--jsonArray作为mongoexport选项)的mongodb集合中导出了这个文档,文件名为mycollectionexported.json: [{"_id":{"$oid"

各位开发者好

我在这件事上有点困难,所以你的帮助会很好:)

我正在创建一个脚本shell,它将定期(多亏了cron)在脱机mongodb和firebase之间执行同步

我过去常常处理mongodb的导出,但这一个在包含空格的字符串值上表现得很奇怪

例如,我从名为users(使用--jsonArray作为mongoexport选项)的mongodb集合中导出了这个文档,文件名为mycollectionexported.json:

[{"_id":{"$oid":"5fc253c493b9f7363c8d1011"},"emailVerified":true,"disabled":false,"isKickstarter":false,"isPremiun":false,"gender":"Male","nationality":"None","type":"admin","optMarketing":false,"optNewsletter":false,"cguValidated":true,"providers":[],"email":"test@reflect.com","displayName":"John Doe","phoneNumber":"0644080050","homeAddress":{"street":"rue Pasteur","number":24,"zipcode":94270,"city":"Le Kremlin-Bicêtre","country":"France"},"familyId":{"$oid":"5fc253c493b9f7363c8d1010"},"createdAt":{"$date":"2020-11-28T13:42:28.51Z"},"updatedAt":{"$date":"2020-11-28T13:42:28.51Z"},"__v":0}]
您可以看到,对于“displayName”、“homeAddress.street”或“homeAddress.city”等键,我在值中有空白

当我尝试使用jq将新导出的集合存储到经典变量中,并在标准输出上显示它时,jq的行为非常奇怪

执行的脚本:

#!/bin/bash

documents=$(jq -c ".[]" ./mycollectionexported.json)
for document in $documents; do
  echo ""
  echo $document
done
输出:

{"_id":{"$oid":"5fc253c493b9f7363c8d1011"},"emailVerified":true,"disabled":false,"isKickstarter":false,"isPremiun":false,"gender":"Male","nationality":"None","type":"admin","optMarketing":false,"optNewsletter":false,"cguValidated":true,"providers":[],"email":"test@reflect.com","displayName":"John

Doe","phoneNumber":"0644080050","homeAddress":{"street":"rue

Pasteur","number":24,"zipcode":94270,"city":"Le

Kremlin-Bicêtre","country":"France"},"familyId":{"$oid":"5fc253c493b9f7363c8d1010"},"createdAt":{"$date":"2020-11-28T13:42:28.51Z"},"updatedAt":{"$date":"2020-11-28T13:42:28.51Z"},"__v":0}
预期(无换行):

这怎么可能? jq文档中没有这方面的信息。 当我使用字符串值中不包含空格的json文件执行此操作时,它会按预期工作


感谢您的帮助和未来的答案:)

如果jq的输出是一行,为什么不只是:

echo "$documents"
或者,如果调用jq的结果是一个可能包含多个项的流,并且如果希望流中的每个项都作为bash变量可用,那么如果bash足够最新,则可以使用
mapfile
(aka
readarray
);否则,您可以考虑使用BASH <代码>而<代码>循环,例如沿着:

declare -a document
while read -r item ; do
  document+=("$item")
done < <(jq -c ....)
声明-文档
而read-r项;做
文件+=(“$item”)

对$documents中的文档执行<
;do
根本不逐行读取;它在空白处进行拆分,并尝试扩展任何看起来像文件名通配符模式的内容(如果存在任何匹配项,则会产生非常奇怪的结果)。看,是的,我的问题更多的是for循环,而不是jq本身。谢谢你的回答。愚蠢的错误…您描述的问题与jq无关,而是与您对bash变量的使用有关。我的建议是阅读bash,在不涉及jq的情况下测试您的理解。
declare -a document
while read -r item ; do
  document+=("$item")
done < <(jq -c ....)