基本上我想在插入数据之前检查数据库中是否存在特定数据(使用本机mongodb驱动程序),所以我尝试使用collection.findOne()
来检查数据是否存在,如果属性的属性是collection.insert()
执行的null。
我的一些代码:
exports.addUser = function(req, res) {
var twitterId = req.body.provider;
var userEmail = req.body.email;
db.collection('users', function(err, collection) {
collection.findOne({'email':userEmail }, function(err, item){
if(item.email === null){
collection.insert({
'email': userEmail,
'provider': {
'twitter': {
'id': twitterId
}
}
}, function(err, result) {
if (err) {
res.send({'error':'An error has occurred'});
} else {
console.log('Success: ' + JSON.stringify(result[0]));
res.send(result[0]);
}
});
}else{
console.log("Email exits ");
}
});
});
}
答案 0 :(得分:1)
您的if
语句希望item.email
明确设置为null
。如果item.email
不是item
的属性,则该if语句将评估为false
。
var foo = {bar:'baz'}
foo.bar // 'baz'
foo.notSet // undefined
foo.notSet === undefined // true
foo.notSet === null // false
// now if we set foo.notSet to undefined...
foo.notSet = null // undefined
foo.notSet === null // true
所以,选择很少......
if (item.email) {} else {};
if ('email' in item) {} else {};
if (item.hasOwnProperty('email')) {} else {};
如果您尝试调用对象本身不存在的属性,JS将检查它的原型,如果它在原型上不存在,那么它将返回undefined。
in
运算符将检查左侧操作数是否是右侧对象的属性。
最后Object.hasOwnProperty
将检查它的参数作为对象的属性。
所有这一切,{upsert:true}
可能是你最好的选择。