2017-01-05 17 views
0

我在我的桶中有一个包含ID(childList)列表的文档。 我想查询这个列表和保持结果订购就像在我的JSON。我的查询是像(使用Java SDK):如何从couchbase获得有序的结果

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) ...); 

的问题是输出顺序是很重要的。

任何想法?

谢谢。

+0

您应该可以简单地在查询的末尾添加一个ORDER BY'子句:https://developer.couchbase.com/documentation/server/current/n1ql/n1ql-language-reference/orderby .html –

+0

该列表是一个String列表。我们称之为chlidList 。我需要childList [0]成为第一行,依此类推。如果我将使用ORDER BY子句,它将使用字符串顺序进行排序。 – user6479138

+0

你是否总是从1个单一文件开始连接?如果是这样,为什么不执行k/v操作而不是N1QL查询?您将获得更多的控制权,与您获取B文档的订单上的JOIN ... –

回答

0

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

您可能需要另一个maptoList之前提取的名称和ID,或执行你的域对象转变甚至可能...

的步骤是:

  1. 使用异步API
  2. 得到的文档
  3. 提取孩子的名单和流这些ID
  4. 异步读取每个孩子的文档和流他们但他们留在原来的顺序
  5. 收集所有成List<JsonDocument>
  6. 块,直到该列表已准备好并返回该列表。
+0

非常感谢。这有很大帮助。 – user6479138

+0

那么分页结果呢?有没有办法通过k/v操作来完成它? – user6479138

+0

你是指参考文件?您可以在平面图中的from()之后使用skip和rx运算符 –