如何从couchbase获得有序结果

如何从couchbase获得有序结果,couchbase,n1ql,couchbase-java-api,nosql,Couchbase,N1ql,Couchbase Java Api,Nosql,我的桶中有一个包含ID列表(childList)的文档。 我想查询这个列表,并保持结果的有序性,就像我的JSON一样。我的查询类似于(使用java SDK): String query=new StringBuilder().append(“选择B.name,META(B).id作为id”) .append(“FROM”+bucket.name()+“A”) .append(“使用密钥$id”) .append(“JOIN”+bucket.name()+“B ON key ARRAY i FOR

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

String query=new StringBuilder().append(“选择B.name,META(B).id作为id”)
.append(“FROM
”+bucket.name()+“
A”)
.append(“使用密钥$id”)
.append(“JOIN
”+bucket.name()+“
B ON key ARRAY i FOR i IN A.childList end;”).toString()

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

n1qlQueryResult.allRows().forEach(n1qlQueryRow -> (add to return list ) ...);
问题在于输出的顺序很重要

有什么想法吗


谢谢。

这里是一个没有N1QL的解决方案的大致概念,前提是您总是从一个文档开始:

List<JsonDocument> listOfBs = bucket
      .async()
      .get(idOfA)
      .flatMap(doc -> Observable.from(doc.content().getArray("childList"))) 
      .concatMapEager(id -> bucket.async().get(id))
      .toList()
      .toBlocking().first();
List listOfBs=bucket
.async()
.get(idOfA)
.flatMap(doc->Observable.from(doc.content().getArray(“childList”))
.concatmapanger(id->bucket.async().get(id))
托利斯先生()
.toBlocking().first();
您可能希望在
toList
之前有另一个
map
来提取名称和id,或者执行域对象转换,甚至可能

这些步骤是:

  • 使用异步API
  • 获取文档中的
  • 提取子项列表并流式传输这些ID
  • 异步获取每个子文档并将其流化,但保持原始顺序
  • 将所有数据收集到
    列表中
  • 阻止,直到列表准备就绪并返回该列表

  • 您应该能够简单地将一个
    orderby
    子句附加到查询的末尾:列表是一个字符串列表。让我们称之为chlidlest。我需要childList[0]作为第一行,依此类推。如果我将使用ORDERBY子句,它将使用字符串ORDER进行排序。您是否总是从一个文档开始加入?如果是这样,为什么不执行k/v操作而不是N1QL查询?在获取B文档的顺序上,与连接相比,您将获得更多的控制权…非常感谢。这很有帮助。那么分页结果呢?有没有一种方法可以通过k/v操作来完成?您是指参考文档?在flatmap中的from()之后可以使用skip和take rx运算符。我们使用了跳跃和限制。