【问题标题】:How to get ordered results from couchbase如何从 couchbase 获取有序结果
【发布时间】:2017-01-05 12:20:54
【问题描述】:

我的存储桶中有一个包含 ID 列表 (childList) 的文档。 我想查询此列表并保持结果有序,就像在我的 JSON 中一样。我的查询就像(使用 java SDK):

String query = new StringBuilder().append("SELECT B.name, META(B).id as id ") .append("FROM" + bucket.name() + "A ") .append("USE KEYS $id ") .append("JOIN" + bucket.name() + "B ON KEYS ARRAY i FOR i IN A.childList end;").toString();

此查询将返回我将转换为我的域对象的行并创建如下列表:

n1qlQueryResult.allRows().forEach(n1qlQueryRow -> (add to return list ) ...);

问题是输出顺序很重要。

有什么想法吗?

谢谢。

【问题讨论】:

  • 您应该能够简单地将ORDER BY 子句附加到查询的末尾:developer.couchbase.com/documentation/server/current/n1ql/…
  • 列表是一个字符串列表。我们称它为 chlidList。我需要 childList[0] 成为第一行,依此类推。如果我将使用 ORDER BY 子句,它将使用字符串顺序进行排序。
  • 您是否总是从 1 个单个文档开始加入?如果是这样,为什么不执行 k/v 操作而不是 N1QL 查询呢?与 JOIN 相比,您将在获取 B 文档的顺序上获得更多控制权...

标签: couchbase n1ql couchbase-java-api nosql


【解决方案1】:

这里是一个没有 N1QL 的解决方案的粗略想法,前提是您总是从单个 A 文档开始:

List<JsonDocument> listOfBs = bucket
      .async()
      .get(idOfA)
      .flatMap(doc -> Observable.from(doc.content().getArray("childList"))) 
      .concatMapEager(id -> bucket.async().get(id))
      .toList()
      .toBlocking().first();

您可能希望toList 之前的另一个map 提取名称和ID,或者执行您的域对象转换,甚至可能...

步骤如下:

  1. 使用异步 API
  2. 获取A文件
  3. 提取子列表并流式传输这些 ID
  4. 异步获取每个子文档并流式传输它们但保持它们的原始顺序
  5. 全部收集到List&lt;JsonDocument&gt;
  6. 阻塞直到列表准备好并返回该列表。

【讨论】:

  • 非常感谢。这帮助很大。
  • 那么分页结果呢?有没有办法通过k/v操作来做到这一点?
  • 您的意思是参考文件?您可以在平面图中的 from() 之后使用 skip 和 take rx 运算符
  • 谢谢西蒙。我们使用了跳过和限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2014-11-03
  • 2021-08-23
  • 2017-11-05
  • 1970-01-01
  • 2019-10-20
相关资源
最近更新 更多