这是数据 [ { “发件人ID”:“64d9c926c17fd183a93d5e35”, “接收者ID”:“64d9c92dc17fd183a93d5e39”, “时间戳”:“2023-08-14T07:39:45.946Z”, “内容”:“布鲁”, “状态”:“已交付”, “类型”:“聊天”, “消息ID”:“8188946b-67e4-4d86-a927-32842361825c” },........ ]
我只想选择所有已发送的状态并将状态更改为已发送
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);
}
我无法传递一个名为“已发送”的字符串
Redis 查询失败
JSON.SET rooms:64d9c926c17fd183a93d5e35-64d9c92dc17fd183a93d5e39 $.*[?(@.status=="sent")].status '"delivered"'
感谢帮助,我正在使用 npm 和 redis 节点版本是 20,redis 可能也是最新版本
注意: 这适用于 REDIS CLI 和节点客户端
JSON.SET rooms:64d9c926c17fd183a93d5e35-64d9c92dc17fd183a93d5e39 $.[*].status '"delivered"'
我已经尝试过了
$.*[?(@.status=="已发送")]
.*[?(@.status=="已发送")]
$.*[?(@.status=="'已发送'")]
$.[?(@.status==已发送)]
我无法传递一个名为“已发送”的字符串
其中一些 JSONPath 事情可能很棘手。这个是无效的。它的作用是从根部
$
开始。然后 .*
选择根中对象的所有字段。由于没有,所以它不返回任何内容。然后,假设那些未找到的字段是数组,它会匹配这些数组中的每个对象以获得 status
的 sent
属性。在匹配的地方,它会选择这些属性。
我喜欢使用 jsonpath.com 来测试我的 JSON 和相应的路径。使故障排除更加容易。
无论如何,我让它与以下 JSONPath 一起使用:
$[?(@.status=='sent')].status
这里可以通过 CLI 运行:
127.0.0.1:6379> JSON.SET rooms:1234 $ '[ { "senderID": "64d9c926c17fd183a93d5e35", "receiverID": "64d9c92dc17fd183a93d5e39", "timestamp": "2023-08-14T07:39:45.946Z", "content": "bru", "status": "delivered", "type": "chat", "messageID": "8188946b-67e4-4d86-a927-32842361825c" }]'
OK
127.0.0.1:6379> JSON.GET rooms:1234 "$[?(@.status=='delivered')].status"
"[\"delivered\"]"
127.0.0.1:6379> JSON.GET rooms:1234 "$[?(@.status=='sent')].status"
"[]"
我刚刚做了一个 JSON.GET,但它也应该可以找到 JSON.SET。