如何将操作符分配给变量

时间:2013-12-03 12:20:39

标签: javascript node.js mongodb

我正在研究喜欢和不同于图像的部分。当用户喜欢图像时,它会将userID推送到mongodb中的数组。当用户不喜欢图像时,它会从阵列中删除userID。我正在尝试使用$addToSet$pull来完成此操作。

问题:如何在一个块中执行此操作,而不是为这两个块编写两个单独的bolck?目前我使用的是变量opr,但它不起作用。我怎样才能使它发挥作用?

if(likeAction == "like"){
    var opr          = '$addToSet'
}
else if(likeAction == "unlike"){
    var opr          = '$pull'
}

Like.update( 
    { imageID: imageID }, 
    { opr : { userIDs: userID } },
    function(err){
        if(!err){
            Like.findOne({imageID : imageID}, function(err,like){
                image.likeCount      = like.userIDs.length
                image.save(function(err){
                    if(!err){
                        return res.send({
                            status: {
                                error: 0,
                                message: "Successful"
                            }
                        })
                    }
                })
            })
        }
    }
);

2 个答案:

答案 0 :(得分:1)

我认为这应该可以合并两个查询并解决opr问题:

var update = {};
if (likeAction === 'like'){
  update.$addToSet = { userIDs: userID };
  update.$inc      = { likeCount : 1 };
} else if (likeAction === 'unlike'){
  update.$pull  = { userIDs: userID };
  update.$inc   = { likeCount : -1 };
}

Like.update({ imageID: imageID }, update, ...);

答案 1 :(得分:0)

你可以这样做:

var opr, updateCommande = {};

if(likeAction == "like"){
    opr          = '$addToSet'
}
else if(likeAction == "unlike"){
    opr          = '$pull'
}

updateCommande[opr]= { userIDs: userID }

Like.update( 
    { imageID: imageID }, 
    updateCommande,
    function(err){
        if(!err){
            Like.findOne({imageID : imageID}, function(err,like){
                image.likeCount      = like.userIDs.length
                image.save(function(err){
                    if(!err){
                        return res.send({
                            status: {
                                error: 0,
                                message: "Successful"
                            }
                        })
                    }
                })
            })
        }
    }
);