Пересматривайте проекции соединения на лету при использовании курсоров - PullRequest
0 голосов
/ 04 февраля 2019

Можно ли редактировать, какие поля объединяемого элемента загружаются при использовании курсора 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 для получения некоторых продуктов,но в этом случае мне нужно больше данных от соответствующих специалистов.Есть ли способ сказать Апострофу: «Эй, на этот раз я также получу эти поля из объединения» вместо того, чтобы сделать исходную проекцию более разрешающей или сделать это в 2 шага (сначала запрос продуктов для идентификаторов специалистов, а затем запрос для всегоспециалистов)?

Например, я попробовал это:

    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 голосов
/ 13 февраля 2019

В настоящее время это невозможно элегантным способом.Фильтры, настроенные для объединения, вызываются непосредственно перед вызовом toArray для запроса, который выбирает соединение, что означает, что в настоящее время нет возможности их переопределить.См. Реализацию метода joinDriver:

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

Конечно, вы можете повторно получить объединенные документы после запроса, но это не является хорошим решением.

Реализация, которая допускала это, включала бы обновление опции withJoins, которая может использоваться для переопределения того, какие объединения выполняются вообще, путем передачи массива имен соединений, чтобы также поддерживать включение объектов в этот массив.Эти объекты могут содержать как имя объединения (или путь точки соединения), так и переопределения для фильтров курсора.Затем это должно быть распространено до joinDriver без введения разрывов до н.э., что возможно, поскольку используемые методы принимают аргумент options.

...