2016-08-16 32 views
0

我目前正在尝试为我正在进行的项目做一些复杂的N1QL,理论上我可以在多次N1QL调用中完成所有这些处理,并且每次解析结果,但是如果可能的话,我想为了包含在一个调用中。可能在N1ql中链接结果?

我想要做的是:

  • 过滤器包含有超过1个ID
  • 在该列表中读回所有其它ID的“dataSync.test.id”字段中的所有文件
  • 使用该列表以获得含有这些ID的其他文件
  • 获取这些文件的“dataSync.test._channels”场(任选被DOCTYPE过滤器可能有助于解析)

这可能会返回一个“dataSync.test._channels”列表

在N1QL中这可能吗?看起来好像可能是这样,但是我无法正确地理解语法。

我的数据结构,看起来有点像

{ 
    "dataSync": { 
    "test": { 
     "_channels": [ 
     "RP" 
     ], 
     "id": [ 
     "dataSync_user_1015", 
     "dataSync_user_1010", 
     "dataSync_user_1005" 
     ], 
     "_lastUpdatedBy": "TEST" 
    } 
    }, 
    ... 
} 


{ 
    "dataSync": { 
    "test": { 
     "_channels": [ 
     "RSD" 
     ], 
     "id": [ 
     "dataSync_user_1010" 
     ], 
     "_lastUpdatedBy": "TEST" 
    } 
    }, 
... 
} 
+0

到目前为止您尝试了哪些查询?我想你会能够做一个普通的旧的SQL子查询来获得这个。 – Kirk

+0

我最终什么事是使用一对夫妇的查询和一些Java代码来赞美它: 读出的ID,不包括通过ID:从写 选择array_remove(dataSynchronization.trident.id,$ dataSyncId)作为IDLIST其中$ dataSyncId在dataSynchronization.trident.id和array_length(dataSynchronization.trident.id)> 1 然后,迭代ID列表并查询通道对象 从write中选择dataSynchronization.trident._channels其中docType ='user '和$ dataSyncId在dataSynchronization.trident.id和array_length(dataSynchronization.trident.id)<2“; – chiloutus

+0

然后更新通道 ”update write set dataSync hronization.trident._channels = $ channels,“+ ”dataSynchronization.trident._lastUpdatedBy = $ lastUpdatedBy其中dataSynchronization.trident.id和array_length(dataSynchronization.trident.id)中的dataSyncId> 1“ 对不起,如果这是格式不好,我不想“回答”我自己的问题 – chiloutus

回答

0

是。我想你可以做所有这些。

带过滤的初始ID集可以作为子查询检索,然后您可以通过连接获取子频繁文档。

SELECT fulldoc FROM(select meta().id as dockey from doc where a = 1)as mydoc INNER JOIN doc fulldoc ON KEYS mydoc.dockey;

这里可以完成优化。首先尝试测序,以确保完成工作。