【发布时间】:2013-01-16 08:01:05
【问题描述】:
我有如下所示的 DocPad 文档:
---
categories: [{slug: ""}, {slug: ""}, ...]
---
Document content.
如何查询meta.category 数组中具有预定义 slug 值的所有文档?
【问题讨论】:
标签: javascript node.js docpad query-engine
我有如下所示的 DocPad 文档:
---
categories: [{slug: ""}, {slug: ""}, ...]
---
Document content.
如何查询meta.category 数组中具有预定义 slug 值的所有文档?
【问题讨论】:
标签: javascript node.js docpad query-engine
我们有几种方法可以解决这个问题。
setFilter
https://gist.github.com/4556245
最直接的方法是通过getDocumentsWithCategory 模板帮助器,它利用查询引擎的setFilter 调用,允许我们指定一个自定义函数(我们的过滤器),该函数将针对集合中的每个模型执行,并基于它的布尔值返回值 保留模型或将其从集合中移除。
此解决方案的缺点是:
parseAfter 事件https://gist.github.com/4555732
如果我们希望能够获得所有可用类别的信息,但仍然需要为每个帖子每次定义我们的类别,那么我们可以使用 parseAfter 事件来挂钩元我们的文档的数据,将类别提取到全局类别对象中,然后使用 id 引用更新我们文档的类别。
缺点是我们仍然需要有多余的类别信息。
https://gist.github.com/4555641
如果我们只想定义一次类别信息,然后只在帖子中引用类别 ID,那么这个解决方案是最理想的。
【讨论】:
我设法为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)
当我尝试调用它时,我得到一个空集合。
【讨论】:
searchString,因为对我来说,meta 始终是类别,而关键始终是 slug。我将尝试调试它,看看我是否可以管理它。无论如何我会报告的。谢谢。
我没有解决方案,但是您看到 docpad 作者的博客的source code 了吗?有一些查询元数据对象属性是否存在的示例。希望对您有所帮助!
【讨论】: