1

我正在尝试使用 nodejs 本机驱动程序更新 mongo db 中的文档。

最初它是这样插入的:

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

现在我需要更新文档,我需要在其中插入一个新元素"NIKK":198到 score 对象以使其成为scores:{"MITH":220,"NIKK":198}

问题是关键只有一个变量。当我更新时它没有更新

下面是我正在尝试的代码

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在未定义数据的回调中收到以下错误。

{ [MongoError: Cannot apply $addToSet modifier to non-array] name: 'MongoError', lastErrorObject: { err: 'Cannot apply $addToSet modifier to non-array', code: 12591, n: 0, connectionId: 56, ok : 1 }, errmsg: 'Cannot apply $addToSet modifier to non-array', ok: 0 } undefined

4

2 回答 2

4

您需要以编程方式构建$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);
    }
);

注意:这样做的尴尬是因为您正在使用需要在运行时构建的动态密钥。考虑重新设计您的架构,使其scores变成一个看起来像这样的数组:

scores: [{name: 'MITH', value: 220}, {name: 'NIKK', value: 198}]
于 2013-01-19T03:54:26.853 回答
0

我想你想要$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);
        });
于 2013-01-18T06:27:48.580 回答