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

Redefine join projections on the fly when using cursors

是否可以编辑使用 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 "hey, this time also get me THESE fields from the join" 而不是使原始投影更加宽松或分两步进行(首先查询产品的专家 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
      })
    },

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

目前无法以优雅的方式实现。为连接配置的过滤器在为获取连接的查询调用 toArray 之前调用,这意味着目前没有机会覆盖它们。查看joinDriver方法的实现:

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

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

允许这样做的实现将涉及升级 withJoins 选项,该选项可用于通过传递连接名称数组来覆盖执行哪些连接,以还支持在该数组中包含对象.这些对象可以具有连接名称(或连接点路径)和游标过滤器的覆盖。然后必须在不引入 bc 中断的情况下将其传播到 joinDriver,这是可能的,因为所涉及的方法确实采用 options 参数。