1

基本上我想在插入数据之前检查数据库中是否存在特定数据(我使用本机 mongodb 驱动程序),所以我尝试使用collection.findOne()检查数据是否存在,如果属性的属性为 null 则collection.insert()执行。

显然我的代码没有按照逻辑工作,请有人赐教!

我的一些代码:

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 ");
            }
        });


    });
}
4

1 回答 1

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}可能是你最好的选择。

于 2013-01-22T00:39:01.057 回答