This is the data
[
{
"senderID": "64d9c926c17fd183a93d5e35",
"receiverID": "64d9c92dc17fd183a93d5e39",
"timestamp": "2023-08-14T07:39:45.946Z",
"content": "bru",
"status": "delivered",
"type": "chat",
"messageID": "8188946b-67e4-4d86-a927-32842361825c"
},……..
]
I just want to select all the status sent and change status to delivered
if (messageIDs.length === 0) {
this.chatRepository.jsonSet(
`rooms:${room?.roomID}`,
room?.status,
`$.*[?(@.status=="sent")].status`,
);
}
async jsonSet(key: string, value: any, option?: string) {
if (!option) {
option = '$';
}
console.log(key, option, value)
await this.redisProvider.publisher.json.set(key, option, value);
}
I am failing to pass a string there called ‘sent’
Redis Query that failed
JSON.SET rooms:64d9c926c17fd183a93d5e35-64d9c92dc17fd183a93d5e39 $.*[?(@.status=="sent")].status '"delivered"'
Help is appreciated, I am using npm with redis
node version is 20 and redis probably latest version as well
Note:
This works both on REDIS CLI and from node Client
JSON.SET rooms:64d9c926c17fd183a93d5e35-64d9c92dc17fd183a93d5e39 $.[*].status '"delivered"'
I have tried
$.*[?(@.status=="sent")]
.*[?(@.status=="sent")]
$.*[?(@.status=="’sent’")]
$.[?(@.status==sent)]
I am failing to pass a string there called ‘sent’
2
Answers
Some of these JSONPath things can be tricky. This one is invalid. What it does is start at the root with
$
. Then the.*
selects all the fields on the object in the root. Since there are none, it returns none. Then, assuming those not-found fields are arrays, it matches each object in those array for astatus
property ofsent
. Where this matches, it selects those properties.I like to use jsonpath.com to test out my JSON and corresponding paths. Makes the troubleshooting easier.
Regardless, I got it to work with the following JSONPath:
And here it is working from the CLI:
I just did a JSON.GET but it should work find for JSON.SET too.
You can use this
To change all objects in the top-level array with status
sent
to bedelivered