MongoDB:将元素添加到内部的json对象,而这两个键值都存储在variables中

我正在尝试用nodejs本地驱动程序更新mongo数据库中的文档。

最初它被插入像:

matches { _id:2001, requester:"MITH", accepter:"NIKK", toss:"MITH", bat:"NIKK", scores:{"MITH":220}, status:0, won:"MITH" } 

现在我需要更新文件,我需要插入一个新元素"NIKK":198分数对象,使其scores:{"MITH":220,"NIKK":198}

问题是关键只在一个variables中出现。 当我更新它不更新

下面是我正在尝试的代码

 var _jsonMatch = {status:4}; var _scorepush = {} _scorepush[variablevalue] = 198; // variablevalue in reference above is NIKK var data = {"$set": _jsonMatch,"$push": {"scores":_scorepush} } mith.findAndModify({_id:mith.db.bson_serializer.ObjectID.createFromHexString(matchId)}, [], data, { upsert: true,new:true }, function(error, match){ if( error ) callback(error); else callback(null, match); }); 

编辑

我试图$addToSet而不是$push ,我得到了数据未定义的callback下面的错误。

{[MongoError:无法将$ addToSet修饰符应用于非数组] name:'MongoError',lastErrorObject:{err:'无法将$ addToSet修饰符应用于非数组',代码:12591,n:0,connectionId:56,ok :1},errmsg:'不能将$ addToSet修饰符应用于非数组',ok:0} undefined

您需要以编程方式构build您的$set对象,以在设置'scores.NIKK'的键中使用点符号 。 所以要更新上面显示的文档:

 variablevalue = 'NIKK'; var set = { status: 4 }; set['scores.' + variablevalue] = 198; mith.findAndModify({_id: 2001}, [], { $set: set }, { upsert: true, new: true }, function(error, match){ if( error ) callback(error); else callback(null, match); } ); 

注意:这样的尴尬是因为你正在使用你需要在运行时build立的dynamic密钥。 考虑重新工作你的模式,以便scores是一个看起来像这样的数组:

 scores: [{name: 'MITH', value: 220}, {name: 'NIKK', value: 198}] 

我想你想$set而不是$push

 var _jsonMatch = {status:4}; var _scorepush = {} _scorepush[variablevalue] = 198; // variablevalue in reference above is NIKK _jsonMatch["scores"] = _scorepush; var data = {"$set": _jsonMatch }; mith.findAndModify({_id:mith.db.bson_serializer.ObjectID.createFromHexString(matchId)}, [], data, { upsert: true,new:true }, function(error, article){ if( error ) callback(error); else callback(null, article); });