Meteor React публикует объединенные коллекции

С Meteor (1.4.2.3) и React у меня есть коллекция Objects, у которой есть itemId, который ссылается на коллекцию Items.

В настоящее время я подписываюсь на коллекцию на стороне клиента с помощью:

export default createContainer(() => {
  let objectsSub = Meteor.subscribe('allObjects');
  var objects = Objects.find({}, {
      transform: function (doc) {
        doc.item = Items.findOne({
          _id: doc.itemId
        });
        return doc;
      }
    }).fetch();
  return {
    objects: objects,
  }
}, App);

Это работает отлично, но я думаю, что более элегантно объединять коллекции на стороне сервера. Однако ни одно из найденных мной решений не работает

Преобразование при определении коллекции

const Objects = new Mongo.Collection('objects',
  {
    transform: function (doc) {
      doc.item = Items.findOne({
        _id: doc.itemId
      })
    }
  });

Консоль дает:

Ошибка: преобразование должно возвращать объект

Преобразование при публикации

if (Meteor.isServer) {
  Meteor.publish('allObjects', function () {
    return Objects.find({}, {
      sort: { startedAt: -1 },
      transform: function (doc) {
        doc.item = Items.findOne({
          _id: doc.itemId
        });
        return doc;
      }
    });
  });
};

TypeError: Невозможно прочитать имя свойства неопределенного

Где name является свойством Items


person Joost Döbken    schedule 09.02.2017    source источник
comment
Взгляните на github.com/englue/meteor-publish-composite.   -  person chazsolo    schedule 09.02.2017
comment
@chazsolo: я пытался, но детей нет в подписной коллекции. Я думаю, что это текущая проблема: github.com/englue/meteor-publish- составной/проблемы/67   -  person Joost Döbken    schedule 09.02.2017


Ответы (1)


Я обычно делаю это в публикации следующим образом:

  Meteor.publish('allObjects', function () {
    let cursor = Objects.find({}, {
      sort: { startedAt: -1 });
    });

    let transformData = (fields) => {
        fields.item = Items.findOne({
          _id: fields.itemId
        });

        return fields;
    };

    let handle = cursor.observeChanges({
        added: (id, fields) => {
            fields = transformData(fields);
            this.added('objects', id, fields);
        },
        changed: (id, fields) => {
            fields = transformData(fields);
            this.changed('objects', id, fields);
        },
        removed: (id) => {
            this.removed('objects', id);
        }
    });

    this.ready();

    this.onStop(() => {
        handle.stop();
    });
  }
person zim    schedule 09.02.2017