Публикация изменений в одном поле вложенного документа
У меня сложная структура данных, которая создается по запросам из нескольких коллекций и публикуется.
Он отлично работает для первоначального создания, и на моей локальной машине все наблюдаемые изменения отражаются в клиенте, как и ожидалось. Тем не менее, в моей промежуточной среде я получаю следующую ошибку от мини-монго, когда наблюдается изменение
Uncaught Error: при замене документа имя поля может не содержать "." (…)
Код публикации выглядит так, где pub
это this
из Meteor.publish
а также rootObj
является ссылкой на объект в памяти, который изменяет свойства, но никогда не уничтожает его.
function _republish(pub, rootId, rootObj, handles, startup) {
// cleanup handles
if (handles.foo) {
handles.foo.stop();
}
// some query which could depend on rootObj/other calculated values
let cursor = SubColl.find({_id: {$in: bar}});
handles.foo = cursor.observeChanges({
removed(_id) {
rootObj.bar = rootObj.bar.filter(o => o._id !== _id);
pub.changed('foobarbaz', rootId, {bar: rootObj.bar})
},
changed(_id, fields) {
const index = rootObj.bar.findIndex(line => line._id === _id);
const changed = {};
_.each(fields, (value, field) => {
rootObj.bar[index][field] = value;
changed[`bar.${index}.${field}`] = value;
});
pub.changed('foobarbaz', rootId, changed);
},
added(_id, fields) {
rootObj.bar.push(_.extend({}, fields, {_id}));
if (!startup) {
// deeper children stuff
pub.changed('foobarbaz', rootId, {bar: rootObj.bar});
}
}
});
// deeper children stuff
startup = false;
// if startup was true, expect caller to publish this
}
Как мы видим, публикация работает нормально, когда я pub.changed
только на bar
, но пытается обновить определенное поле вложенного документа (например, bar.0.prop
) приводит к противоречивому поведению
Если возможно, я хочу избежать повторной публикации всего bar
как это огромно по сравнению с обновлением простого свойства.
Как я могу опубликовать изменения в одном поле вложенного документа?