如何获取所有文档中最新的

cfm*_*cfm 3 sanity groq

在 sanity studio 中,您可以获得所有文档的最新版本的不错列表。如果有草稿,您会收到草稿,如果没有,您会收到已发布的草稿。

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

*[
  _type == $type &&
  !defined(*[_id == "drafts." + ^._id])
]._id
Run Code Online (Sandbox Code Playgroud)

解决 API 中重大变化的一种方法是使用length() = 0in 代替,!defined()但这会使本来就很慢的查询速度慢 10-20 倍。

有谁知道一种制作仅考虑最新版本的过滤器的方法?

编辑:我需要这个的一个例子是,如果我想查看没有任何类别的所有文档。无论是已发布的文档还是没有类别的草稿,它都会显示在普通过滤器中。因此,如果您添加类别但不立即想要发布,那么它在无类别列表中将会令人困惑。,'-)

cfm*_*cfm 5

API v 改进 100 倍2021-03-25

我能够快速解决这个问题的唯一方法是首先对子查询进行投影,这样它就不会为每个非草稿运行一次。然后我想,为什么不投影两组,然后找出重叠部分,这样会更快!它的运行速度比 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
}
Run Code Online (Sandbox Code Playgroud)
  1. 首先,我得到草稿和非草稿,并将其“存储”在这个投影中,就像一个变量——ish
  2. 然后我从我的非草稿开始 -published
  3. drafts并过滤掉我的“变量”中具有对应项的任何内容
  4. 最后,我将所有草稿添加到已过滤的非草稿列表中