在mongodb中覆盖对象

时间:2017-01-25 03:11:38

标签: mongodb meteor

这应该很简单,但令人惊讶的是非常困难且非常令人沮丧。我试图覆盖一个'对象' mongodb中的字段,其中包含用户在我的客户端网页中创建的新对象。我已经验证我传递给更新操作的所有其他字段实际上都在更新,但javascript对象除外。而不是使用我传递的对象进行更新(虽然我验证的是填充了我正在传递的对象),但它只是将其更新回{}而不是传递的是什么:

{ nodes:[ { w: 120, h: 80,type: 'InHive',left: 184,top: 90,text: 'item',query: 'hey',name: 'sample',id: '7686132d-6fcf-4a3b-baa2-b1c628e0b2d6' } ], edges: [], ports: [],groups: [] }

当我尝试直接从mongo控制台界面更新meteor方法之外的数据字段时,它会使用javascript对象成功覆盖该字段。我在这里做错了什么,因为我不能为我的生活把这个弄出来?

服务器方法

    'updateOneWorkflow': function(id, field, object) {
    this.unblock;
    if (Meteor.userId()) {
        var _username = Meteor.user().username;
        MYCOLLECTION.update({
            _id: id
        }, {
            $set: {
                [field]: object, //this just gets reset back to {} whenever this update method is called
                "metadata.last_modified_dt": new Date(), //this gets updated
                "metadata.modified_by": Meteor.userId(), //this gets updated
                'metadata.modified_by_username': _username //This gets updated
            }
        });
    } else {
        throw new Meteor.Error(403, "You are not authorized to perform this function");
    }
}

客户来电:

var _jsonformat = toolkit.exportData();
        var currentid = Session.get('rulesRowClicked')._id;
        console.log(_jsonformat);
        Meteor.call('updateOneWorkflow' , currentid, 'data', _jsonformat, function(err, res){
            if(err){
                toastr.error('Failed to save result ' + err);
            }
            else{
                toastr.success('Saved workflow');
            }
        });

2 个答案:

答案 0 :(得分:0)

我相信你的问题源于这一行:[field]: object。我不相信这是动态访问对象字段的正确方法。相反,尝试动态更新字段:

'updateOneWorkflow': function(id, field, object) {
    this.unblock;
    if (Meteor.userId()) {
        var _username = Meteor.user().username;
        var newObj = {
            "metadata": {
                "last_modified_dt": new Date(),
                "modified_by": Meteor.userId(),
                "modified_by_username": _username
            }
        };
        newObj[field] = object;
        MYCOLLECTION.update({
            _id: id
        }, {
            $set: newObj
        });
    } else {
        throw new Meteor.Error(403, "You are not authorized to perform this function");
    }
}

答案 1 :(得分:0)

这个问题比我想象的要疯狂。如果您正在使用Meteorjs并且您正在使用Aldeed Schema 2集合框架,那么即使您将字段类型设置为Object,它似乎完全忽略json对象的更新/插入,除非您设置与对象完全相同的模式(包括嵌套数组对象)并将其附加到您的集合。我见过的最愚蠢的事情,不知道为什么没有什么能够警告你。我删除了架构附件,它工作正常。