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

Node.js MongoDB/Node-检查集合中的文档是否具有特定字段,node.js,mongodb,express,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.conn

我是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是否已经存在于问题的文档中``

所以我想检查
{u id':questionId}
是否有:
{[ip]:true}
或者甚至
ip
作为一个字段

数据库条目如下所示(为清晰起见进行了编辑):

我们可以看到127.0.0.1已经投票了,所以我想再次停止该用户对该问题的投票

我用IP做这件事,因为我希望非注册用户能够投票


我相信这很简单,但我完全迷路了。

您可以通过将ip移动到一个有值位置来解决这个问题

类似于
“ip”:127001

您现在可以轻松地检查ip字段的存在和/或其值

下面的查询将在
问题
中查找
ip
字段(如果找到);不执行任何操作,否则将
ip
设置为
问题
文档

db.collection('questions').findOneAndUpdate({"_id": questionId, "ip": { $exists: false } }, {$set : {"ip" : 127001} }, (err, result) => {
    if (err) return res.send(err)
})

这将起作用,除了每一个投票的新IP都会覆盖原有的IP,除非我将它们存储在“IP”下的一个数组中,但我也不知道如何访问它们……它只会在新IP不存在时添加新IP,而在IP已经存在时不做任何操作。不知道你为什么认为它会被覆盖。你的要求是什么?很抱歉,我假设您对当前解决方案的每个问题都有一个ip。需要存储ip数组吗?如果需要存储ip数组,可以使用
db.collection('questions').findOneAndUpdate({“\u id”:questionId},{$addToSet:{“ip”:127001},(err,result)=>{if(err)return res.send(err)}
。此变体使用不允许重复的
addtoSet
Operator。因此,您保证在任何时候都有唯一的问题IP。
db.collection('questions').findOneAndUpdate({"_id": questionId, "ip": { $exists: false } }, {$set : {"ip" : 127001} }, (err, result) => {
    if (err) return res.send(err)
})