过滤
这是 GraphQL 库版本 7 的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL 库版本 5 LTS。 |
本页介绍如何在 Neo4j GraphQL 库中对订阅应用过滤器。但是请注意,
-
过滤只能应用于订阅操作的根部。
-
聚合目前不支持订阅类型,也没有可用的方法。
可以创建订阅以针对节点(create
/update
/delete
)或关系(create
/delete
)的更改。
虽然格式因订阅目标是节点还是关系而略有不同,但提供 where
参数允许对返回到订阅的事件进行过滤。
订阅节点事件
where
参数允许对目标节点的顶级属性指定过滤器。只有与这些属性和类型匹配的事件才会返回给订阅。
例如,考虑以下类型定义
type Movie @node {
title: String
genre: String
averageRating: Float
releasedIn: Int
}
extend schema @subscription
现在,以下是如何在创建订阅时应用过滤
创建 (CREATE)
要按电影的类型过滤对 创建
操作的订阅,可以这样做
subscription {
movieCreated(where: { genre: { eq: "Drama" } }) {
createdMovie {
title
}
}
}
这样,只有类型为 "Drama"
的新创建电影才会触发此订阅的事件。
|
更新 (UPDATE)
以下是如何过滤电影中平均评分大于 8 的 更新
操作的订阅
subscription {
movieUpdate(where: { averageRating: { gt: 8 } }) {
updatedMovie {
title
}
}
}
这样,您应该只在电影被修改时收到由平均评分大于 8 的电影触发的事件。
|
这些事件可能看起来像这样
mutation {
makeTheMatrix: createMovies(input: {title: "The Matrix", averageRating: 8.7}) {
title
averageRating
},
makeResurrections: createMovies(input: {title: "The Matrix Resurrections", averageRating: 5.7}) {
title
averageRating
},
}
mutation {
updateTheMatrix: updateMovie(
where: { title: { eq: "The Matrix" } }
update: { averageRating: { set: 7.9 }}
) {
title
},
updateResurrections: updateMovie(
where: { title: { eq: "The Matrix Resurrections" }}
update: { averageRating: { set: 8.9 }}
) {
title
}
}
因此,根据前面描述的订阅,这些 GraphQL 操作应仅针对电影 "The Matrix"
触发。
删除 (DELETE)
以下是如何使用 NOT
过滤器按电影的类型过滤对 删除
操作的订阅
subscription {
movieDeleted(where: { NOT: { genre: { eq: "Comedy" } } }) {
deletedMovie {
title
}
}
}
这样,只有被删除的电影(除了 "喜剧"
类型)才会触发此订阅的事件。
|
组合运算符
所有前面提到的运算符都可以使用 AND
、OR
和 NOT
运算符进行组合。它们接受一个与 where
参数格式相同的项目数组作为参数,这意味着它们也可以嵌套以形成复杂的组合。
例如,考虑一个喜欢喜剧电影,但不喜欢 2000 年代早期浪漫喜剧,并将《黑客帝国三部曲》作为他们最喜欢的电影的用户。他们可以订阅涵盖这一特定兴趣集的任何更新,如下所示:
subscription {
movieUpdated(where: {
OR: [
{ title: { contains: "Matrix" } },
{ genre: { eq: "comedy"} },
{ AND: [
{ NOT: { genre: { eq: "romantic comedy" }} },
{ releasedIn: { gt: 2000 } },
{ releasedIn: { lte: 2005 } }
] },
]
}) {
updatedMovie {
title
}
}
}