nosql - 如何在 couchbase 查询中按 json 对象的值对文档进行排序?

标签 nosql couchbase sql++ spring-data-couchbase

我的集合中存储了以下类型的数据,称为人员,我正在使用 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/

相关文章:

python - Aerospike Python 客户端。 UDF 模块用于统计记录。无法注册模块

spring-boot - 中型数据项目需要选择哪个分布式数据库

Couchbase cli cluster-init 返回 "too many values to unpack"

sql - NoSQL 中的地理查询

couchbase - 如何在 Couchbase 中仅选择和更新此 map 中的名称值?

unicode - 在 Couchbase Java Query DSL 中,如何过滤非 ASCII 的字段值?

python - 从 Mongoengine 中的列表字段中删除嵌入文档

node.js - 具有高读取性能的 NoSQL 数据库(写入访问不重要)?

Couchbase 和 GeoSpatial 数据

json - 如何从N1QL中的数组中删除元素