如何修改包含相当复杂的对象和子对象的 Couchbase 记录?

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

我有一个沙发库数据库,里面充满了如下所示的记录:

{
  "_class": "com.discussoftware.server.shared.model.bo.licenseBo",
  "customerId": "A1A2",
  "term": "SUBSCRIPTION",
  "keys": {
    "abc-123-evaluation": {
      "active": true,
      "expirationDate": 1669680000000,
      "key": "abc-123-evaluation",
      "name": "base product, floating, subscription",
      "notBefore": 1667088000000,
      "options": [
        {
          "option": "base",
          "quantity": 1
        },
        {
          "option": "secondary",
          "quantity": 1
        },
        {
          "option": "teriary",
          "quantity": 1
        },
        {
          "option": "ops",
          "quantity": 1
        }
      ],
      "units": 1,
      "version": 
       {
    "major": 1,
        "minor": 1,
        "patch": 0 
       }    
    }
  },
  "master": "def-456",
  "productId": "a1a2a3a4",
  "supportId": "A1A2A3"
}

我可以根据许可证密钥进行选择,声明如下:

SELECT  *
FROM server1` AS d
WHERE ANY v in OBJECT_VALUES(d.keys) 
   SATISFIES v.expirationDate < 1713744000000 
     AND v.expirationDate > 1701734400000
     AND v.version.major == 1
     AND v.version.minor == 1
     AND v.version.patch == 0
   END;

但是我在编写更新来更新版本值时遇到了麻烦。
我认为在 60 次左右的尝试中,我尝试过的最好的一次是:

UPDATE `server1` AS d 
SET v.version = {"major": 2, "minor": 1, "batch": = 0}
WHERE ANY v in OBJECT_VALUES(d.keys)
  SATISFIES v.expirationDate < 1713744000000
     AND v.expirationDate > 1701734400000
     AND v.version.major == 2024
     AND v.version.minor == 0
     AND v.version.patch == 1
  END;
couchbase record sql++
1个回答
0
投票

我能想到的最简单的

UPDATE
来更新该字段是:

UPDATE records._default._default 
USE KEYS "doc1"
SET `keys`.`abc-123-evaluation`.`version` = {"major":9, "minor":9, "patch":9}
© www.soinside.com 2019 - 2024. All rights reserved.