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); });