Couchbase N1QL 更新复杂结构 JSON 文档

Couchbase N1QL Update complex-structured JSON document

简介

嗨!使用 Spring Startup Actuator 端点后,我收到了有关我的应用程序启动步骤的数据。这是一个 JSON 响应,我想稍微修改一下,使其更具可读性。由于我在我的项目中使用了 CouchBase,我认为这可能是修改具有复杂结构的大 JSON 的最简单方法。 我需要帮助编写 N1QL 查询来修改我的 JSON

先决条件

我有一个 JSON 文档,其中的结构已加载到我的 CouchBase 中的一个存储桶中(我知道它很大,所以我恳请您耐心等待并尝试理解它)

{
  "springBootVersion": "2.4.7",
  "timeline": {
    "startTime": {
      "nano": 909000000,
      "epochSecond": 1627565536
    },
    "events": [
      {
        "endTime": {
          "nano": 666000000,
          "epochSecond": 1627566426
        },
        "duration": {
          "seconds": 481,
          "nano": 751000000,
          "units": [
            "SECONDS",
            "NANOS"
          ],
          "negative": false,
          "zero": false
        },
        "startTime": {
          "nano": 666000000,
          "epochSecond": 1627566426
        },
        "startupStep": {
          "name": "spring.beans.instantiate",
          "id": 2480,
          "tags": [
            {
              "key": "beanName",
              "value": "hystrix-configuration"
            },
            {
              "key": "beanType",
              "value": "class org.apache.camel.model.HystrixConfigurationDefinition"
            },
            {
              "key": "exception",
              "value": "class org.springframework.beans.factory.NoSuchBeanDefinitionException"
            },
            {
              "key": "message",
              "value": "No bean named 'hystrix-configuration' available"
            }
          ],
          "parentId": 4
        }
      },
      {
        ...
      }
    ]
  }
}

问题

我需要按以下方式格式化 JSON 文档:

  1. 我想排除字段“springBootVersion”、“timeline” 并只留下对象的“事件”数组。
  2. 在“事件”数组中的每个对象中,我需要删除字段“startTime”, “endTime”和内部对象“duration”我想删除字段“units”、“zero”、“negative”。
  3. 此外,如果可能的话,我想将字段纳秒修改为毫秒,方法是将其值除以 1 000 000,并将名称从“纳秒”更改为“毫秒”。
  4. 这可以是 UpdateSelect 类型的查询,我不太介意。
  5. (得到答案后添加)我也想按字段对对象数组进行排序events.duration.secondsevents.duration.miliseconds(如果 seconds对于 2 个对象是相等的)

想要的结果

因为 JSON 对象修改后的结果应该是这样的:

[
  {
    "duration": {
      "seconds": 481,
      "miliseconds": 751
    },
    "startupStep": {
      "name": "spring.beans.instantiate",
      "id": 2480,
      "tags": [
        {
          "key": "beanName",
          "value": "hystrix-configuration"
        },
        {
          "key": "beanType",
          "value": "class org.apache.camel.model.HystrixConfigurationDefinition"
        },
        {
          "key": "exception",
          "value": "class org.springframework.beans.factory.NoSuchBeanDefinitionException"
        },
        {
          "key": "message",
          "value": "No bean named 'hystrix-configuration' available"
        }
      ],
      "parentId": 4
    }
  },
  {
    ...secondOjbect
  },
  {
    ...ThirdOjbect
  }
]

我对 couchBase 和 N1QL 还很陌生,所以我只能更新结构简单的 JSON 对象。请寻求您的帮助。

*注意:如果您知道更简单更容易修改JSON的方法以满足我的需要,请分享。

SELECT 
   ARRAY {e.startupStep, 
          "duration":{e.duration.seconds, 
                      "miliseconds": e.duration.nanosconds/1000000
                     }
         } 
   FOR e IN d.timeline.events 
   END AS events
FROM default AS d
WHERE .......

如果你想像这样更新 {“事件”:[]}

UPDATE default AS d
SET d = {"events": ARRAY {e.startupStep, 
                          "duration":{e.duration.seconds, 
                                      "milliseconds": e.duration.nanosconds/1000000
                                     }
                          } 
                   FOR e IN d.timeline.events 
                   END 
        }
WHERE .......

按秒对事件排序 ARRAY

SELECT (SELECT e.startupStep,
               {e.duration.seconds, milliseconds} AS duration
        FROM d.timeline.events AS e
        LET milliseconds = e.duration.nanosconds/1000000
        ORDER BY e.duration.seconds, milliseconds
       ) AS events
FROM default AS d
WHERE .......