如何从couchbase获得有序结果

时间:2017-01-05 12:20:55

标签: couchbase n1ql couchbase-java-api nosql

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

问题是输出顺序很重要。

有什么想法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这里是一个没有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();

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

步骤如下:

  1. 使用异步API
  2. 获取A档案
  3. 提取子项列表并流式传输这些ID
  4. 异步获取每个子文档并将其流式传输但保持原始顺序
  5. 将所有内容收集到List<JsonDocument>
  6. 阻止,直到列表准备好并返回该列表。