如何从 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,或者执行您的域对象转换,甚至可能...
步骤是:
- 使用异步 API
- 获取A文档
- 提取子列表并流式传输这些 ID
- 异步获取每个子文档并流式传输它们但保持它们的原始顺序
- 全部收集到
List<JsonDocument>
- 阻塞直到列表准备就绪并且return那个列表。
我的存储桶中有一个包含 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,或者执行您的域对象转换,甚至可能...
步骤是:
- 使用异步 API
- 获取A文档
- 提取子列表并流式传输这些 ID
- 异步获取每个子文档并流式传输它们但保持它们的原始顺序
- 全部收集到
List<JsonDocument>
- 阻塞直到列表准备就绪并且return那个列表。