我是node,express和mongodb的新手,我一直在查看文档和其他StackOverflow几个小时,但仍未设法解决这个问题。
我正在使用MongoDB node.js驱动程序。
我正在尝试创建一个投票应用,人们每次投票只能投票一次。为此,我将他们的IP存储在问题集中的问题文档中:
var questionId = ObjectId(req.body._id);
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
ip = ip.replace("::ffff:", "").replace(/\./g, "");
db.collection('questions')
.findOneAndUpdate({"_id": questionId}, {$set : {[ip] : true} }, (err, result) => {
if (err) return res.send(err)
})
但是,我想验证问题的文档中没有IP。
所以我想检查{'_id': questionId}
是否有:{[ip]: true}
甚至是ip
作为字段。
数据库条目如下所示(为清晰起见而编辑):
{
"_id": {
"$oid": "58caeb3402f11c2d66dc3f41"
},
"question": "Metallica or Megadeth?",
"answer1": "Metallica",
"answer2": "Megadeth",
"answer1_votes": 14,
"answer2_votes": 11,
"127001": true
}
正如我们所看到的,127.0.0.1已经投票,所以我想阻止该用户再次就该问题进行投票。
我正在使用IP,因为我希望非注册用户能够投票。
我确信这很简单,但我完全迷失了。
答案 0 :(得分:1)
您可以通过将ip移动到值位置来解决此问题。
类似于"ip" : 127001
。
您现在可以轻松检查是否存在ip字段和/或其值。
以下查询会在ip
中查找question
字段,如果找到的话;什么都不做,否则将ip
设置为question
文档。
db.collection('questions').findOneAndUpdate({"_id": questionId, "ip": { $exists: false } }, {$set : {"ip" : 127001} }, (err, result) => {
if (err) return res.send(err)
})