【问题标题】:mongo native not creating datamongo native 不创建数据
【发布时间】:2013-01-24 00:55:21
【问题描述】:

如果数据库中存在 facebook id,我会尝试创建数据,否则会创建新数据,但是第一个条件可以正常工作,但是当它创建数据时没有任何反应,即使我硬编码提供程序值,也只能得到 connot read property 'provider' of null

db.collection('accounts', function(err, collection){
    collection.findOne({'email': fbEmail}, function(err, item){
        var providerId = item.provider.facebook.id;
        console.log("facebook id should be: "+providerId);
        if(providerId == ""){
            collection.update({email:fbEmail, 'provider.facebook.id':""}, {$set: {"provider.facebook.id": fbId}}, {safe:true}, function(err){
                if(err){
                    console.log(err);
                }else{
                    console.log("id updated!");
                };
            });
        }else{ //creates a new user
            console.log("creating a new account...");
            collection.update({'email': fbEmail}, {
                'email': fbEmail,
                'provider':
                    {
                        'facebook': {'id': fbId},                            
                        'twitter': {'id': ""}                                
                    }                    
            }, {upsert:true}, function(err, doc){
                if(err){
                    console.log("Error finding email "+err);
                }                
            });             
        }
    });
});

【问题讨论】:

  • 在您的findOne 回调中,您需要在检查item.provider 之前检查item 是否为null。如果这是一封新电子邮件,item 将是 null

标签: javascript node.js mongodb express node-mongodb-native


【解决方案1】:

accounts 集合文档中的一个(第一个)具有provider=null。您可以通过以下方式修改findOne条件来避免它:

collection.findOne({'email': fbEmail, 'provider': {$exists: true}}, ...

请注意,此修改将跳过所有未设置 provider 字段(或设置为 null)的帐户。

【讨论】:

  • 很抱歉,如果我不完全理解您的注释,当提供商中的 facebook id 为 null 时,我仍然需要执行第一个 collection.update,但如果我跳过所有没有设置 provider 字段的帐户那么我不确定如何再次执行上述操作。
  • 我想我解决了 =) 只需将创建新电子邮件放在 findOne 之外并使用 {$exists: true} 如您所说,谢谢!
  • 我写这个注释的目的是警告你没有提供提供者的情况。无论如何,我很高兴你解决了这个问题。不客气!
  • 其实还是有问题,如果email不存在我还需要新建数据,查看mongodb查询文档...
  • 在这种情况下,我通常会获取帐户 (findOne)(如果存在),然后处理或创建检索到的对象,最后保存 (save(usert=true))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多