0

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

问题是输出顺序很重要。

有任何想法吗?

谢谢你。

4

1 回答 1

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在提取名称和 id之前,您可能需要另一个toList,或者甚至可能需要执行域对象转换......

步骤是:

  1. 使用异步 API
  2. 拿到A文件
  3. 提取子列表并流式传输这些 id
  4. 异步获取每个子文档并将它们流式传输,但保持它们的原始顺序
  5. 全部收集到一个List<JsonDocument>
  6. 阻塞直到列表准备好并返回该列表。
于 2017-01-05T19:22:17.087 回答