这应该很简单,但令人惊讶的是非常困难且非常令人沮丧。我试图覆盖一个'对象' 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');
}
});
答案 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对象的更新/插入,除非您设置与对象完全相同的模式(包括嵌套数组对象)并将其附加到您的集合。我见过的最愚蠢的事情,不知道为什么没有什么能够警告你。我删除了架构附件,它工作正常。