首页 > 解决方案 > N1QL 值 NOT IN 子查询,它返回一个数组

问题描述

我正在尝试编写一个 N1QL 查询,该查询返回其 id 不在数组中的所有记录。该数组可在另一个文档中找到。

我的播放列表文档示例:{"id":1,"name":"playlist1","tracksId":[1,2]}

我的 Track 文档示例:{"id":1,"title":"songtitle"}

具体来说,我希望我的查询返回在我的播放列表文档的 trackId 数组中找不到其 id 的所有曲目。

这是我使用子查询解决此问题的最佳尝试:

SELECT * FROM Track
WHERE id NOT IN (SELECT tracksId FROM Playlist WHERE id = 1)

不幸的是,这不起作用,因为我的子查询在字段内返回一个数组。有谁知道解决这个问题的方法?

标签: subquerycouchbasen1ql

解决方案


默认情况下,N1QL 查询给出了 JOSN 对象的数组。IN 或 NOT IN 的右边必须是左边数据类型的 ARRAY。

子查询项目一个元素使用 RAW 避免像下面这样的对象。

SELECT * FROM Track
WHERE id NOT IN (SELECT RAW tracksId FROM Playlist WHERE id = 1)

在您的情况下,tracksId 是另一个数组。您可以展平嵌套的 ARRAY 或 UNNEST 并创建一层 ARRAY

SELECT * FROM Track
WHERE id NOT IN ARRAY_FLATTEN((SELECT RAW tracksId FROM Playlist WHERE id = 1),1);

或者

 SELECT * FROM Track
 WHERE id NOT IN (SELECT RAW track FROM Playlist AS p UNNEST p.tracksId As track WHERE p.id = 1);
     

推荐阅读