如何基于对象数组在docpad中查询文档

时间:2013-01-16 08:01:05

标签: javascript node.js docpad query-engine

我有DocPad文档,如下所示:

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

Document content.

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

3 个答案:

答案 0 :(得分:3)

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

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

https://gist.github.com/4556245

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

此解决方案的缺点是:

  • 我们必须在每个帖子中重新定义我们的类别信息
  • 我们没有直接的方法可以获取有关我们可用的所有类别的信息

通过模板助手和parseAfter事件

https://gist.github.com/4555732

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

缺点是我们仍然需要冗余的类别信息。

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

https://gist.github.com/4555641

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

答案 1 :(得分:1)

我设法为docpad.coffee中的给定slug值“bar”创建一个“foo”集合:

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)

当我试着打电话时,我得到一个空集合。

答案 2 :(得分:0)

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