MongoDB / Node-检查集合中的文档是否具有特定字段

时间:2017-03-17 12:21:14

标签: node.js mongodb express

我是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,因为我希望非注册用户能够投票。

我确信这很简单,但我完全迷失了。

1 个答案:

答案 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)
})