如何从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"
}
}
答案 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为一位数字。
如果这不是您想要的结果,请更精确地说明您想要的内容。