Публикация изменений в одном поле вложенного документа

У меня сложная структура данных, которая создается по запросам из нескольких коллекций и публикуется.

Он отлично работает для первоначального создания, и на моей локальной машине все наблюдаемые изменения отражаются в клиенте, как и ожидалось. Тем не менее, в моей промежуточной среде я получаю следующую ошибку от мини-монго, когда наблюдается изменение

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 как это огромно по сравнению с обновлением простого свойства.

Как я могу опубликовать изменения в одном поле вложенного документа?

0 ответов

Другие вопросы по тегам