0

我有如下所示的 DocPad 文档:

---
categories: [{slug: ""}, {slug: ""}, ...]
---

Document content.

如何查询meta.category数组中具有预定义 slug 值的所有文档?

4

3 回答 3

3

我们有几种方法可以解决这个问题。

通过模板助手和查询引擎setFilter

https://gist.github.com/4556245

最直接的方法是通过一个getDocumentsWithCategory模板助手,它利用查询引擎的setFilter调用,允许我们指定一个自定义函数(我们的过滤器),该函数将针对集合中的每个模型执行,并基于它的布尔返回值保留模型或将其删除集合。

该解决方案的缺点是:

  • 我们必须在每个帖子中重新定义我们的类别信息
  • 我们无法立即获得有关我们可用的所有类别的信息

通过模板助手和parseAfter事件

https://gist.github.com/4555732

如果我们希望能够获得关于我们可用的所有类别的信息,但仍然需要为每个帖子每次定义我们的类别,那么我们可以使用parseAfter事件挂钩到我们文档的元数据,提取将类别输出到全局类别对象中,然后使用 id 引用更新我们文档的类别。

缺点是我们仍然必须有多余的类别信息。

通过模板助手和全局类别列表

https://gist.github.com/4555641

如果我们只想定义我们的类别信息一次,然后只在我们的帖子中引用类别 ID,那么这个解决方案是最理想的。

于 2013-01-17T14:32:02.163 回答
1

我设法为给定的 slug 值 "bar in 创建一个 "foo" 集合docpad.coffee

collections:
  foo: (database) ->
    database.findAllLive().setFilter("search", (model, value) ->
      categories = model.get('categories')
      return false unless Array.isArray categories
      for category in categories
        if (category.slug and category.slug == value)
          return true
      return false
    ).setSearchString("bar")

但是当我尝试创建一个帮助函数返回一个给定数组元(“类别”)的集合时,对象的键(“slug”)和值(“bar”):

createCollection: (meta, key, value) ->
  result = @getDatabase().createLiveChildCollection()
    .setFilter("search2", (model, searchString) ->
      objects = model.get(meta)
      return false unless Array.isArray objects
      for object in objects
        if (object[key] and object[key] == searchString)
          return true
      return false
    ).setSearchString(value)

当我尝试调用它时,我得到一个空集合。

于 2013-01-16T16:10:27.030 回答
0

我没有解决方案,但是您看过docpad作者博客的源代码吗?有一些查询元数据对象属性是否存在的示例。希望有帮助!

于 2013-01-16T14:32:12.453 回答