【问题标题】:How to query documents in docpad based on arrays of objects如何根据对象数组在 docpad 中查询文档
【发布时间】:2013-01-16 08:01:05
【问题描述】:

我有如下所示的 DocPad 文档:

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

Document content.

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

【问题讨论】:

    标签: javascript node.js docpad query-engine


    【解决方案1】:

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

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

    https://gist.github.com/4556245

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

    此解决方案的缺点是:

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

    通过模板助手和parseAfter 事件

    https://gist.github.com/4555732

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

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

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

    https://gist.github.com/4555641

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

    【讨论】:

      【解决方案2】:

      我设法为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)
      

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

      【讨论】:

      • 这很有趣。我一直在尝试这个,但因为我错过了 model.get 方法而被卡住了。我一直在尝试创建一个辅助函数,所以我什至没有尝试过静态(?)集合版本。不同的是,我只需要提供searchString,因为对我来说,meta 始终是类别,而关键始终是 slug。我将尝试调试它,看看我是否可以管理它。无论如何我会报告的。谢谢。
      【解决方案3】:

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

      【讨论】:

      • 是的,这是一个查询。我的问题不是关于元数据属性的存在。在我的例子中,属性实际上是未知数量的对象,我对它们的属性很感兴趣。
      猜你喜欢
      • 2023-03-24
      • 2015-08-08
      • 2015-06-22
      • 1970-01-01
      • 2020-06-11
      • 2018-09-05
      • 2021-11-12
      • 2023-01-14
      • 1970-01-01
      相关资源
      最近更新 更多