如何将内部连接作为 GROQ 中的条件?
Posted
技术标签:
【中文标题】如何将内部连接作为 GROQ 中的条件?【英文标题】:How do I make a inner join as a condition in GROQ? 【发布时间】:2019-02-01 12:28:19 【问题描述】:我有一个包含 posts 的数据集,其中可能有一个类别数组。
如何进行 GROQ 查询以选择标题为“页面”的类别的所有帖子?
我认为我可以这样做:
*[_type == 'post' && categories[]->title == 'Page']
body,
slug,
我可能需要使用函数在数组内进行匹配,但 the cheetsheet 对我来说太密集了 - 我找不到它。
我的数据集的要点是:
_createdAt: "2018-08-24T17:59:04Z",
_id: "e84d78f0-81ed-4524-9c36-f38a1f1b2375",
_rev: "1X9D03Y03BUslZ33alDJwF",
_type: "category",
_updatedAt: "2018-08-24T18:13:14Z",
description: "Pages/Sider",
title: "Page"
,
_createdAt: "2018-08-26T21:57:54Z",
_id: "3c023e29-b167-4021-be00-5e8dc14f65cc",
_rev: "WQjjTjyYBRudo6JCOBCUj7",
_type: "post",
body: [
],
categories: [],
,
_createdAt: "2018-08-24T17:57:55Z",
_id: "3d8f0c40-a45d-4dc7-ad95-ed1b49bca4af",
_rev: "WQjjTjyYBRudo6JCO0spXR",
_type: "post",
body: [
],
categories: [
_key: "491c03573205",
_ref: "e84d78f0-81ed-4524-9c36-f38a1f1b2375",
_type: "reference"
]
一个简单的查询:
*[_type == 'post']
// body,
"category": categories[]->title,
// slug,
categories
返回:
categories: [],
category: []
categories: [
_key: "491c03573205",
_ref: "e84d78f0-81ed-4524-9c36-f38a1f1b2375",
_type: "reference"
],
category: [
Page
]
【问题讨论】:
【参考方案1】:根据the join documentation,您可以在 GROQ 过滤器中使用内部联接。我认为这应该对您有用,前提是您的类别文档是 _type: "category"
:
*[_type == 'post' &&
*[_type == "category" &&
title == "Page"][0]._id in categories[]._ref]
body,
slug,
希望这能解决您的问题!
【讨论】:
谢谢!我只需要在 GROQ 中了解以下内容:当您说[condition][0]
选择带有“类别”和 title == "page"
的帖子时,您是只检查 categories[]
中的第一个对象还是数组中的第一个项目in
运算符返回?我对 GROQ 如何处理数组感到困惑。看起来您可以只指出它是一个数组,然后编写查询,因为它不是,GROQ 将在数组中的每个项目上迭代您的选择器。然后有时你必须非常具体地说,_“我想要数组的第一个或第 n 个索引”。
@kmeive 您能否详细说明在您的答案中进入内部连接的过滤器?特别是*[...][0]._id in
.
*[condition][0]
将获得*[conidtion]
返回的数组中的第一项。这是因为就目前而言,in
运算符仅适用于左侧的字符串。恐怕我们(还)没有一个操作符来做数组的交集。我认为它适用于您的具体情况,因为逻辑是您想要具有 a 类别且标题为“page”的帖子。
只是为了确认我理解你的答案,我会和你核实一下。 *[_type == "category" && title == "Page"]
将返回一个包含所有已发布类别的数组,因为我们只有一个称为 Page,我们可以安全地获取第一个索引 0 并使用 id 检查所有 _type == 'post'
和 _id == categories[]._ref
?
一个后续问题(也许我应该在这里创建另一个问题,但对我来说是裸露的):我在这里创建了一个演示:skovbar.dk 它通过您的查询调用理智并写入页数。 Antal sider udgivet i sanity:[来自 sanity 的页数]。它部署在谷歌 CDN 上,就像健全的数据一样。当我打开 devtools 时,我根本看不到任何理智的要求!它是如何工作的?!?这是纯粹的魔法;)以上是关于如何将内部连接作为 GROQ 中的条件?的主要内容,如果未能解决你的问题,请参考以下文章