使用光标即时重新定义连接投影

时间:2019-02-03 22:11:37

标签: apostrophe-cms

使用find光标时是否可以编辑要加载的连接件的哪些字段?例如,使用apostrophe-samples项目,我通过添加以下投影来编辑与专家的产品连接:

...
    {
      name: '_specialists',
      type: 'joinByArray',
      withType: 'specialist',
      label: 'Specialists',
      help: 'The right people to ask about this product.',
      filters: {
        projection: {
          title: 1
        }
      }
    }
...

在其他地方,我正在使用find来获取某些产品,但是在这种情况下,我确实需要来自相关专家的更多数据。有没有一种方法可以告诉Apostrophe:“嘿,这次还让我从联接中获得了这些字段”,而不是让原始投影更加宽松或分两步进行(首先在产品中查询专家ID,然后查询整个专家)?

例如,我尝试过:

    self.modulesReady = function() {
      var req = self.apos.tasks.getAnonReq();
      self.apos.docs.getManager('product').find(req, {}, {title:1, specialistsIds:1, _specialists: {slug: 1}}).toArray(function(err, pieces) {
        // do something
      })
    },

但是它仍然只返回原始连接投影中定义的专家头衔。

1 个答案:

答案 0 :(得分:1)

目前,这不可能以一种优雅的方式实现。在为获取联接的查询调用toArray之前,将立即调用为联接配置的过滤器,这意味着当前没有机会覆盖它们。请参见joinDriver方法的实现:

https://github.com/apostrophecms/apostrophe/blob/master/lib/modules/apostrophe-schemas/index.js#L590-L599

您当然可以在查询后重新获取已加入的文档,但这不是一个很好的解决方案。

为此允许的实现将涉及升级withJoins选项,该选项可用于通过传递连接名称数组来根本覆盖执行哪些连接,以支持在该数组中包括对象。这些对象可能具有联接名称(或联接点路径)和游标过滤器的替代特征。然后,必须将其传播到joinDriver而不引入bc中断,这是可能的,因为所涉及的方法确实需要一个options自变量。