如何从couchbase获得有序结果
我的桶中有一个包含ID列表(childList)的文档。 我想查询这个列表,并保持结果的有序性,就像我的JSON一样。我的查询类似于(使用java SDK):如何从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
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运算符。我们使用了跳跃和限制。