我有3个不同的文件。 mongo.json
,elastic.json
,stripe.json
。
每个客户端都有一组客户端,我想比较这些数组的长度,以检查它们是否具有相同数量的客户以防止错误。以下是每个文件的示例:
Mongo.json
[{
"_id": {
"$oid": "59c3942baeef22b03fa573d2"
},
"client_id": "test@test.com",
"name": "Windows Client"
},{
"_id": {
"$oid": "59c3942baeef22b03fa573d2"
},
"client_id": "test2@test2.com",
"name": "Linux Client"
}]
elastic.json
[
{
"alias" : "test@test.com",
"index" : "index1",
"filter" : "-"
},
{
"alias" : "test2@test2.com",
"index" : "index2",
"filter" : "-"
}
]
stripe.json
{
"object": "list",
"data": [
{
"id": "test@test.com",
"object": "customer",
"account_balance": 0,
"created": 1505990903
}
]
}
使用以下命令获取每个数组的长度,但我不知道如何比较这些长度以检查它们是否相同:
jq '. | length' mongo.json elastic.json stripe.json
结果:
2
2
1
我如何比较这些结果?我想要以下输出:
如果它们具有相同的长度:
Everyting is OK.
相反的情况:
Missing customer test2@test2.com
客户ID:是电子邮件。
我怎么能这样做?
答案 0 :(得分:2)
jq -n \
--slurpfile mongo mongo.json \
--slurpfile elastic elastic.json \
--slurpfile stripe stripe.json \
'
[$mongo[][].client_id] as $mongo_ids
| [$elastic[][].alias] as $elastic_ids
| [$stripe[].data[].id] as $stripe_ids
| (($mongo_ids + $elastic_ids + $stripe_ids) | unique) as $all_ids
| {"missing_from_stripe": ($all_ids - $stripe_ids),
"missing_from_elastic": ($all_ids - $elastic_ids),
"missing_from_mongo": ($all_ids - $mongo_ids)}
| [to_entries[] | select(.value|length > 0)] | from_entries
'
...正确发出:
{
"missing_from_stripe": [
"test2@test2.com"
]
}
答案 1 :(得分:0)
这可能吗?
是的,有很多方法可以完成这两项任务。您可能会发现在jq程序中分别跟踪这三个文件最容易。这也可以通过多种方式完成,但我建议从'--argfile NAME FILENAME'选项开始,每个文件一个三元组。
通过确定缺少哪些“客户”,我不能立即明白您的意思,但让我提供这个有希望的有用提示:
如果A和B是两个JSON数组,则表达式(A - B)将发出一个数组,其中包含A中不在B中的项目。
答案 2 :(得分:0)
编辑:这个答案是在Lechucico简化样本数据之前编写的,并澄清了对象之间的关系。以下可能只是粗略的兴趣,因为Charles为修订后的问题提供了一个很好的解决方案。
您需要先了解自己的数据,然后才能取得进展。你可以从报告开始,
"__________________________________________________ mongo.json"
, ($mongo[] | {client_id, name})
, "__________________________________________________ elastic.json"
, ($elastic[] | {alias, index})
, "__________________________________________________ stripe.json"
, ($stripe.data[] | {id, object})
如果上面的过滤器在filter.jq
,那么命令
jq -Mnc \
--argfile mongo mongo.json \
--argfile elastic elastic.json \
--argfile stripe stripe.json \
-f filter.jq
产生
__________________________________________________ mongo.json
{"client_id":"TEST","name":"Windows Client"}
{"client_id":"TEST2","name":"Linux Client"}
__________________________________________________ elastic.json
{"alias":"living","index":"living_v1"}
{"alias":"reindex","index":"living_v1"}
__________________________________________________ stripe.json
{"id":"cus_BRKuwUx0TS1LPL","object":"customer"}
很明显,这些是不同类型的对象,因此它们之间可能没有明显的一对一关系,但如果您调查实际数据和工作流程,您可能会发现更有意义的链接。