Создайте реактивную публикацию с дополнительными полями в каждом документе
Я хочу сделать публикацию с несколькими дополнительными полями, но я не хочу использовать Collection.aggregate
и терять обновления публикации при смене коллекции (поэтому я не могу просто использовать self.added
в ней).
Я планирую использовать Cursor.observeChanges
для достижения этого. У меня есть два основных ограничения:
- Я не хочу публиковать все поля документов
- Я хочу использовать некоторые неопубликованные поля для создания новых. Например, у меня есть элемент поля, где я храню массив
item
_id. Я не хочу публиковать его, но я хочу опубликовать полеitem_count
с длиной моего массива полей
Здесь идет подход:
- Model.find (). ToArray () утверждает, что не имеет метода .toArray ()
- Удалить внедренный документ во вложенном массиве документов
- mongodb.conf bind_ip = 127.0.0.1 не работает, но 0.0.0.0 работает
- (узел: 3341) Устаревание Предупреждение: Mongoose: mpromise
- Отобразить основной вид HTML?
-
Я планирую цепочку поиска запросов. Я никогда этого не делал, поэтому я задаюсь вопросом, возможно ли это. Общая (упрощенная) структура запросов будет выглядеть так: http://jsfiddle.net/Billybobbonnet/1cgrqouj/ (я не могу правильно отобразить код)
-
Основываясь на примере подсчета в документации Meteor , я сохраняю свой запрос в
handle
переменной, чтобы остановить уведомление об изменениях, если клиент не подписывается:
self.onStop(function () { handle.stop(); });
- Я добавляю флаг
initializing = true;
перед моим запросом, и я установил его какtrue
перед вызовомself.ready();
, Я использую этот флаг для изменения переменнойitemCount
только в том случае, если он инициализируется публикацией. Поэтому в основном я меняю свойswitch
следующим образом:
switch (field) { case "item" if (!initializing) itemCount = raw_document.item.length; break; default: }
Я хотел проверить, что этот подход хорош и возможен, прежде чем вносить большие изменения в мой код. Может ли кто-нибудь подтвердить меня, если это правильный путь?
- MongoDB регистрирует все запросы
- выборочная проверка mongoose с использованием 2 полей
- Как эффективно удалять документы по запросу в монго?
- MongoDB - пользователь admin не авторизовался
- Добавить новое поле в каждый документ в коллекции MongoDB
- Как рисовать с помощью Mongoose в Node.js?
- Монгодская структура агрегации | Группировать по нескольким значениям?
- Автоматическое увеличение в MongoDB для сохранения последовательности уникального идентификатора пользователя
Относительно легко держать поля частными, даже если они являются частью запроса к базе данных. Последний аргумент 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.