如何从Couchbase查询深度嵌套的JSON值?

时间:2018-10-29 13:14:46

标签: json regex nested couchbase n1ql

如何从Couchbase查询深度嵌套的json值?我在“ couchbase”存储桶中有以下文档。我需要查询appversion> 3.2.1或appversion <3.3.0或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"
  }
}

3 个答案:

答案 0 :(得分:3)

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");

答案 1 :(得分: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'

由于您的应用程序版本是String,因此应使用replace函数删除“。”然后在比较之前将其转换为int

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

答案 2 :(得分:1)

我不确定您想要什么,但是如果您要查询仅返回文档3的查询,则此查询应该执行此操作。

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

这应该只返回第三个文档。该查询还假定所有应用程序版本均为x.y.z的版本,其中x,y和z为一位数字。

如果这不是您想要的结果,请更精确地说明您想要的内容。