【发布时间】:2020-11-28 15:03:17
【问题描述】:
各位开发者您好!
我在这件事上很难过,所以你的帮助会很好:)
我正在创建一个脚本 shell,它将定期(感谢 cron)在离线 mongodb 和 firebase 之间进行同步。
我使用jq 来处理我的 mongodb 的导出,但是这个在包含空格的字符串值上表现得很奇怪。
例如,我从名为 users 的 mongodb 集合(使用 --jsonArray 作为 mongoexport 选项)中获得了这个导出的文档,文件名为 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}
预期(无换行符):
{"_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 文件执行此操作时,它按预期工作...
感谢您的帮助和未来的答案:)
【问题讨论】:
-
for document in $documents; do根本不会逐行读取;它在空格上拆分,并尝试扩展任何看起来像文件名通配符模式的东西(如果有任何匹配,它可能会产生真正奇怪的结果)。见"Why you don't read lines withfor" 和BashFAQ #1: "How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?" -
是的,我的问题似乎更多地出在 for 循环上,而不是 jq 本身。感谢您的回答。愚蠢的错误...
-
您描述的问题与 jq 无关,而是与您使用 bash 变量有关。我的建议是阅读 bash,并在不涉及 jq 的情况下测试您的理解。