Создайте реактивную публикацию с дополнительными полями в каждом документе

Я хочу сделать публикацию с несколькими дополнительными полями, но я не хочу использовать Collection.aggregate и терять обновления публикации при смене коллекции (поэтому я не могу просто использовать self.added в ней).

Я планирую использовать Cursor.observeChanges для достижения этого. У меня есть два основных ограничения:

  1. Я не хочу публиковать все поля документов
  2. Я хочу использовать некоторые неопубликованные поля для создания новых. Например, у меня есть элемент поля, где я храню массив item _id. Я не хочу публиковать его, но я хочу опубликовать поле item_count с длиной моего массива полей

Здесь идет подход:

  1. Я планирую цепочку поиска запросов. Я никогда этого не делал, поэтому я задаюсь вопросом, возможно ли это. Общая (упрощенная) структура запросов будет выглядеть так: http://jsfiddle.net/Billybobbonnet/1cgrqouj/ (я не могу правильно отобразить код)

  2. Основываясь на примере подсчета в документации Meteor , я сохраняю свой запрос в handle переменной, чтобы остановить уведомление об изменениях, если клиент не подписывается:

 self.onStop(function () { handle.stop(); }); 
  1. Я добавляю флаг initializing = true; перед моим запросом, и я установил его как true перед вызовом self.ready(); , Я использую этот флаг для изменения переменной itemCount только в том случае, если он инициализируется публикацией. Поэтому в основном я меняю свой switch следующим образом:
 switch (field) { case "item" if (!initializing) itemCount = raw_document.item.length; break; default: } 

Я хотел проверить, что этот подход хорош и возможен, прежде чем вносить большие изменения в мой код. Может ли кто-нибудь подтвердить меня, если это правильный путь?

Относительно легко держать поля частными, даже если они являются частью запроса к базе данных. Последний аргумент self.added – это объект, передаваемый клиенту, поэтому вы можете удалять / изменять / удалять поля, которые вы отправляете клиенту.

Вот модифицированная версия вашей скрипки. Это должно делать то, о чем вы просите. (Честно говоря, я не уверен, почему у вас было что-то прикованное после функции observeChanges в вашей скрипке, так что, возможно, я не понимаю вас, но, глядя на остальную часть вашего вопроса, это должно быть так. Извините, если я ошибаюсь. )

 var self = this; // Modify the document we are sending to the client. function filter(doc) { var length = doc.item.length; // White list the fields you want to publish. var docToPublish = _.pick(doc, [ 'someOtherField' ]); // Add your custom fields. docToPublish.itemLength = length; return docToPublish; } var handle = myCollection.find({}, {fields: {item:1, someOtherField:1}}) // Use observe since it gives us the the old and new document when something is changing. // If this becomes a performance issue then consider using observeChanges, // but its usually a lot simpler to use observe in cases like this. .observe({ added: function(doc) { self.added("myCollection", doc._id, filter(doc)); }, changed: function(newDocument, oldDocument) // When the item count is changing, send update to client. if (newDocument.item.length !== oldDocument.item.length) self.changed("myCollection", newDocument._id, filter(newDocument)); }, removed: function(doc) { self.removed("myCollection", doc._id); }); self.ready(); self.onStop(function () { handle.stop(); }); 

Чтобы решить вашу первую проблему, вам нужно указать MongoDB, какие поля она должна возвращать в курсоре. Оставьте поля, которые вы не хотите:

 MyCollection.find({}, {fields: {'a_field':1}}); 

Решение второй проблемы также довольно легко, я бы предложил использовать пакеты сборщиков . Вы можете сделать это легко, так:

 // Add calculated fields to MyCollection. MyCollection.helpers({ item_count: function() { return this.items.length; } }); 

Это будет выполняться до того, как объект будет добавлен в курсор, и создаст свойства для возвращаемых объектов, которые будут вычисляться динамически, а не сохранены в MongoDB.

  • получение атрибутов схемы из модели Mongoose
  • Как обновить значение определенного встроенного документа внутри массива определенного документа в MongoDB?
  • Mongodb $ push в вложенном массиве
  • Как MongoDB сортирует записи, когда не задан порядок сортировки?
  • Монгоский порядок по длине массива
  • Найти записи MongoDB, где поле массива не пустое
  • MongoDB, удалять объект из массива
  • Операторы MongoDB $ gt / $ lt с ценами, хранящимися как строки
  • Как защитить MongoDB с именем пользователя и паролем
  • Как сделать сырые операции mongodb в мангусте?
  • MongoDB $ или запрос
  • Давайте будем гением компьютера.