Node.js MongoDB/Node-检查集合中的文档是否具有特定字段
我是node、express和mongodb的新手,几个小时来我一直在查看文档和其他StackOverflow,但仍然没有找到答案 我正在使用MongoDB node.js驱动程序 我正在尝试创建一个投票应用程序,人们每次投票只能投票一次。为此,我将他们的IP存储在问题集合中的问题文档中: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
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)
})