如何从 couchbase 获取有序结果

How to get ordered results from couchbase

我的存储桶中有一个包含 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();

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

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

问题是输出顺序很重要。

有什么想法吗?

谢谢。

这里是一个没有 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<JsonDocument>
  6. 阻塞直到列表准备就绪并且return那个列表。