如何将内部连接作为 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 中的条件?的主要内容,如果未能解决你的问题,请参考以下文章

Groq:从头设计一个张量流式处理器架构

Groq:从头设计一个张量流式处理器架构

使用内部连接将两个或多个条件定义到存储过程中?

将多条查询结果作为like查询条件

如何在reactJs中的数组内部条件下禁用某些单选按钮

如何将两个 DataTable 与内部连接连接在一起