RedisJSON - 操作 JSON 对象数组(使用 Node Redis 客户端)

问题描述 投票:0回答:1

这是数据 [ { “发件人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==已发送)]

我无法传递一个名为“已发送”的字符串

redis node-redis redis-cli redisjson redisclient
1个回答
0
投票

其中一些 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。

© www.soinside.com 2019 - 2024. All rights reserved.