Sto lavorando con The AWS Command Line Interface for DynamoDB.Come semplificare aws L'output JSON della query DynamoDB dalla riga di comando?
Quando eseguiamo una query su un articolo, otteniamo un output JSON molto dettagliato. È possibile ottenere qualcosa di simile (è stato costruito dal get-item
in modo da essere quasi esaustivo (il tipo NULL
è stato omesso) aws command line help:
{
"Count": 1,
"Items": [
{
"Id": {
"S": "app1"
},
"Parameters": {
"M": {
"nfs": {
"M": {
"IP" : {
"S" : "172.16.0.178"
},
"defaultPath": {
"S": "/mnt/ebs/"
},
"key": {
"B": "dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk"
},
"activated": {
"BOOL": true
}
}
},
"ws" : {
"M" : {
"number" : {
"N" : "5"
},
"values" : {
"L" : [
{ "S" : "12253456346346"},
{ "S" : "23452353463464"},
{ "S" : "23523453461232"},
{ "S" : "34645745675675"},
{ "S" : "46456745757575"}
]
}
}
}
}
},
"Oldtypes": {
"typeSS" : {"SS" : ["foo", "bar", "baz"]},
"typeNS" : {"NS" : ["0", "1", "2", "3", "4", "5"]},
"typeBS" : {"BS" : ["VGVybWluYXRvcgo=", "VGVybWluYXRvciAyOiBKdWRnbWVudCBEYXkK", "VGVybWluYXRvciAzOiBSaXNlIG9mIHRoZSBNYWNoaW5lcwo=", "VGVybWluYXRvciA0OiBTYWx2YXRpb24K","VGVybWluYXRvciA1OiBHZW5lc2lzCg=="]}
}
}
],
"ScannedCount": 1,
"ConsumedCapacity": null
}
C'è un modo per ottenere una produzione più semplice per la parte Items
? come questo:..
{
"ConsumedCapacity": null,
"Count": 1,
"Items": [
{
"Id": "app1",
"Parameters": {
"nfs": {
"IP": "172.16.0.178",
"activated": true,
"defaultPath": "/mnt/ebs/",
"key": "dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk"
},
"ws": {
"number": 5,
"values": ["12253456346346","23452353463464","23523453461232","34645745675675","46456745757575"]
}
},
"Oldtypes": {
"typeBS": ["VGVybWluYXRvcgo=", "VGVybWluYXRvciAyOiBKdWRnbWVudCBEYXkK", "VGVybWluYXRvciAzOiBSaXNlIG9mIHRoZSBNYWNoaW5lcwo=", "VGVybWluYXRvciA0OiBTYWx2YXRpb24K", "VGVybWluYXRvciA1OiBHZW5lc2lzCg=="],
"typeNS": [0, 1, 2, 3, 4, 5],
"typeSS": ["foo","bar","baz"]
}
}
],
"ScannedCount": 1
}
Non c'è niente di utile nel dynamodb - AWS CLI 1.7.10 documentation
Dobbiamo ottenere il risultato dalla riga di comando che sono disposto a utilizzare altri strumenti da riga di comando li ke jq
se necessario, ma tale mappatura jq
sembra complicata per me.
Update 1: jq
soluzione basata (con l'aiuto di risposta di DanielH)
Con jq
è facile, ma non abbastanza bella, si può fare qualcosa di simile:
$> aws dynamodb query --table-name ConfigCatalog --key-conditions '{ "Id" : {"AttributeValueList": [{"S":"app1"}], "ComparisonOperator": "EQ"}}' | jq -r '.Items[0].Parameters.M."nfs#IP".S'
Risultato sarà: 172.16.0.178
jq
-r
opzione gi ti mostra un output raw.
Aggiornamento 2: jq
soluzione basata (con l'aiuto di @ jeff-mercado)
Ecco una versione aggiornata e commentata della funzione Jeff Mercado jq
a unmarshall uscita DynamoDB. Essa vi darà i risultati attesi:
$> cat unmarshal_dynamodb.jq
def unmarshal_dynamodb:
# DynamoDB string type
(objects | .S)
# DynamoDB blob type
// (objects | .B)
# DynamoDB number type
// (objects | .N | strings | tonumber)
# DynamoDB boolean type
// (objects | .BOOL)
# DynamoDB map type, recursion on each item
// (objects | .M | objects | with_entries(.value |= unmarshal_dynamodb))
# DynamoDB list type, recursion on each item
// (objects | .L | arrays | map(unmarshal_dynamodb))
# DynamoDB typed list type SS, string set
// (objects | .SS | arrays | map(unmarshal_dynamodb))
# DynamoDB typed list type NS, number set
// (objects | .NS | arrays | map(tonumber))
# DynamoDB typed list type BS, blob set
// (objects | .BS | arrays | map(unmarshal_dynamodb))
# managing others DynamoDB output entries: "Count", "Items", "ScannedCount" and "ConsumedCapcity"
// (objects | with_entries(.value |= unmarshal_dynamodb))
// (arrays | map(unmarshal_dynamodb))
# leaves values
// .
;
unmarshal_dynamodb
Se si salva l'output DynamoDB
query in un file, diciamo ddb-query-result.json
, è possibile eseguire per ottenere il risultato desiderato:
$> jq -f unmarshal_dynamodb.jq ddb-query-result.json
Hmm, così è che i nomi chiave dell'oggetto indicano i tipi? Come "S" è per le stringhe, "M" è per le mappe e "N" per i numeri? Puoi davvero fare qualcosa di veramente bello con quello. –
La soluzione 'unmarshal_dynamodb.jq' è brillante e il merito va a te & @JeffMercado. Un difetto nell'usare il '/' che ho cercato di risolvere è che qualsiasi filtro che restituisce false non viene trasformato. Questo è importante per i valori booleani che sono effettivamente impostati su false - mantengono la chiave 'BOOL' o' B'. Ho aggiunto una riga per risolvere parzialmente questo problema, ma non ho ancora trovato un modo per risolverlo completamente senza un secondo passaggio: '// (oggetti | if ha (" BOOL ") o ha (" B ") then [false] else null end) ' Questo aggiunge' false' come array a 1 elemento e deve andare prima della riga "# managing others ...". –
@DaveStern: ho rivisto il metodo qui utilizzato per gestire correttamente i valori di falsy. E ora dovrebbe avere un'implementazione più pulita. –