我的集合中存储了以下类型的数据,称为人员,我正在使用 spring-data-couchbase
用于在 Java POJO 中读取此数据,我正在使用 @Query
我的PersonsRepository
中的注释类并根据我的需要编写 SQL 查询来获取数据。
########## Document 1
{
"person": [
{
"id": "name",
"value": "abc"
},
{
"id": "age",
"value": 40
},
{
"id": "country",
"value": "usa"
}
],
"loggedOn": "2020-07-14"
}
########## Document 2
{
"person": [
{
"id": "name",
"value": "def"
},
{
"id": "age",
"value": 32
},
{
"id": "country",
"value": "uk"
}
],
"loggedOn": "2020-08-10"
}
现在我需要在 Couchbase 中编写 SQL,以便可以通过提供值 person
对这些文档进行排序和分页。的属性。
即按姓名排序或按年龄排序
注意:我不想在 Java POJO 中下载数据,然后进行排序和分页,因为数据集很大,需要巨大的网络带宽和 I/O。
最佳答案
要对 ARRAY 中的值进行排序,您需要 ARRAY 位置,并且根据您的情况,该位置可能与文档不同。 您有以下选择:
选项 1)取消数组的嵌套,过滤掉数组并根据数组元素进行排序
SELECT p.id, p.`value`
FROM default AS d
UNNEST d.person AS p
WHERE p.id = "age" AND p.`value` > 30
ORDER BY p.`value`
OFFSET 10
LIMIT 5;
CB 7.1 之前
CREATE INDEX ix1 ON default (ALL ARRAY p.id FOR p IN person END);
CB 7.1+
CREATE INDEX ix1 ON default (ALL ARRAY FLATTEN_KEYS(p.id, p.`value`) FOR p IN person END);
选项 2)找到您感兴趣的 ARRAY 元素并基于该元素进行排序(使用主索引)
SELECT d.*
FROM default AS d
LET pObj = FIRST p FOR p IN person WHEN p.id = "age" END
WHERE pObj IS NOT NULL
ORDER BY pObj.`value`
OFFSET 10
LIMIT 5;
选项 3)更改数据模型,而不是像下面那样将 ARRAY 用作对象(如果属性是唯一的),并在需要时使用 OBJECT 函数 https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/objectfun.html
{
"name":"def",
"age": 32,
"country": "uk",
"loggedOn": "2020-08-10"
}
SELECT d.*
FROM default AS d
WHERE p.age > 30
ORDER BY p.age
OFFSET 10
LIMIT 5;
关于nosql - 如何在 couchbase 查询中按 json 对象的值对文档进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76553642/