【问题标题】:How to get just the most recent of all documents如何获取所有文档中的最新文档
【发布时间】:2021-06-26 05:56:40
【问题描述】:

在 sanity studio 中,您会获得一份包含所有文档的最新版本的精美列表。如果有草稿,你会得到它,如果没有,你会得到已发布的。

对于一些过滤器和脚本,我需要相同的列表。以下 groq 可以完成这项工作,但速度不是很快,并且不适用于新 API (v2021-03-25)。

*[
  _type == $type &&
  !defined(*[_id == "drafts." + ^._id])
]._id

解决 API 中的重大更改的一种方法是使用 length() = 0 代替 !defined(),但这会使已经很慢的查询慢 10-20 倍。

有人知道制作只考虑最新版本的过滤器的方法吗?

编辑:如果我想查看没有任何类别的所有文档,我需要这个示例。无论是已发布文档还是没有类别的草稿,它都会显示在普通过滤器中。因此,如果您添加类别但不想立即发布它会在 no-categories-list 中混淆。 ,'-)

【问题讨论】:

    标签: sanity groq


    【解决方案1】:

    API v2021-03-25 的 100 倍改进?

    我能够快速解决这个问题的唯一方法是首先对子查询进行投影,这样它就不会为每个非草稿运行一次。然后我想,为什么不投影两个集合然后找出重叠,那会​​更快!它的运行速度比 API v1 上的可能快 10 倍以上,比任何新 API 的建议快 100 倍。

    {
      'drafts': *[ _type == $type && _id in path("drafts.**") ]._id,
      'published': *[ _type == $type && !(_id in path("drafts.**"))]._id,
    }
    {
      'current': published[ !("drafts." + @ in ^.drafts) ] + drafts
    }
    
    1. 首先我得到草稿和非草稿并将其“存储”在这个投影中,就像一个变量-?-ish
    2. 然后我从我的非草稿开始 - published
    3. 并过滤掉在我的drafts“变量”中有对应项的任何内容
    4. 最后,我将所有草稿添加到过滤后的非草稿列表中

    【讨论】:

    • 这是 GROQ 预测的一个非常有趣的用例,我很惊讶? 感谢分享,@cfm!我希望您设法让结构构建器成为挑战的一部分,如果没有,请随时在此处或其他问题中跟进 ?
    • 是的,我想我可以在结构构建器中使用它,即使我没有分页功能。我只是在最后添加了无类别的额外过滤器或其他任何过滤器,它的长度不到 150 毫秒。剩下的就是弄清楚如何将我的client.fetch(API-v-new) 结果制作成S.documentList()。如果您认为它有用,请给我点赞:-D
    • 我认为它需要S.documentListItem 的列表。只有当它们出现时,Sanity 才会自动加载每个预览。应该是这样的:S.list().title("").items(async () => const ids = await client.fetch(QUERY); return ids.map(id => S.documentListItem().id(id).schemaType(SCHEMA_TYPE))
    【解决方案2】:

    总的来说,我认为你走在正确的轨道上。一些可以帮助您的想法:

    1. 草稿总是比已发布的文档更新和更新,因此如果给定文档的id in path("drafts.**"),那已经是最后更新的文档了。
    2. 了解上述内容后,您可以跳过草稿查询中的 defined(*[_id == ...]) 部分,从而加快执行速度
    3. 由于草稿已包含在内,我们可以排除带有草稿的已发布文档 (defined(*[_id == "drafts." + ^._id][0]))
    4. 请注意,我在查询末尾添加了[0] 以仅选择第一个匹配的元素。这将略微提高性能。
    5. 要仅获取没有类别的文档,请使用count(categoriesField) < 1
    6. 使用| order(_updatedAt desc) 订购文档以首先获取最新文档
    7. 并对您的请求进行分页以减少负载并加快处理速度。

    这是一个应用这些原则的示例查询(我没有运行它,你可能需要在那里做一些调整):

    *[
      _type == $type &&
      // Assuming you only want those without categories:
      count(categories) < 1 &&
      (
        // Is either a draft -> drafts are always fresher
        _id in path("drafts.**") ||
        // Or a published document with no draft
        !defined(*[_id == "drafts." + ^._id][0])
    
        // ? with the check above we're ensuring only
        // published documents run the expensive defined query
      )
    ]
    // Order by last updated
    | order(_updatedAt desc)
    // Paginate for faster queries
    [$paginationStart..$paginationEnd]
    // Get only the _id, assuming that's what you want
    ._id
    

    希望这会有所帮助?

    【讨论】:

    • 感谢您在@henrique 的参与!是的,hide drafts 的内部查询是有意义的。你的帖子中有很多好的原则。您的查询在新旧 API 中运行。但是,我不确定如何或是否可以在桌面结构中为S.documentList() 添加分页。如果没有分页,它在新 API 中仍然太慢。用户会认为列表是空的并继续前进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2019-12-20
    • 2021-03-30
    相关资源
    最近更新 更多