如何从 couchbase 查询深层嵌套的 json 值?

How to query deep nested json value from couchbase?

如何从 couchbase 查询深层嵌套的 json 值?我在 couchbase 存储桶中有以下文件。我需要查询 appversion>3.2.1 OR appversion <3.3.0 OR appversion=3.4.1。

如何从嵌套的 json 中查询这些值?

我的 Json 文档,

文档 1:

com.whatsapp_1

{
  "doc-type": "App-Metadata",
  "bundleid": "com.whatsapp",
  "value": {
    "appId": "com.whatsapp",
    "appName": "WhatsApp Messenger",
    "primaryCategoryName": "Communication"
  }
}

文档 2:

com.whatsapp_2

 {
  "doc-type": "App-Lookalike",
  "bundleid": "com.whatsapp",
  "value": {
    "com.facebook.orca": 476664,
    "org.telegram.messenger.erick.lite": 423132,
    "com.viber.voip": 286410,
    "messenger.free.video.call.chat": 232830,
    "com.facebook.katana": 223000,
    "com.wChatMessenger_6210995": 219960,
    "com.facebook.talk": 187884
  }
}

文档 3:

com.whatsapp_3

{
  "doc-type": "Internal-Metadata",
  "bundleid": "com.whatsapp",
  "value": {
    "appversion": "3.4.1"
  }
}

要查询嵌套实体,您应该使用 unnest 关键字: https://dzone.com/articles/nesting-and-unnesting-in-couchbase-n1ql

在您的情况下,它将类似于:

select t.* from mybucket t UNNEST `t.value` v where t.doc-type = 'Internal-Metadata' and v.appversion = '3.2.1'

由于您的应用程序版本是字符串,您应该使用替换功能删除“。”然后在比较之前将其转换为int

https://docs.couchbase.com/server/5.5/n1ql/n1ql-language-reference/stringfun.html#fn-str-replace

我不太确定你想要什么,但如果你想要一个只有 return 文档 3 的查询,这个查询应该可以做到。

SELECT *
FROM sampleBucket
WHERE value.appversion>"3.2.1" OR value.appversion <"3.3.0" OR value.appversion="3.4.1"

这应该return只有第三个文件。该查询还假定所有应用程序版本都来自 x.y.z,其中 x、y 和 z 是一位数字。

如果这不是您想要的结果,请更准确地解释您想要的结果。

value是保留关键字,需要用反引号括起来。

SELECT *
FROM sampleBucket
WHERE `doc-type` = 'Internal-Metadata' AND
      (`value`.appversion>"3.2.1" OR 
      `value`.appversion <"3.3.0" OR 
      `value`.appversion="3.4.1");