2017-11-25 130 views
0

我需要在Mongo中检查两个单独的集合以查看是否存在电话号码。嵌套查询两个不同集合的奇怪结果

我首先创建了一个名为全局变量“OWNERID”

然后我看着一个集合呼叫“资料”。如果我传递的电子邮件值存在于该集合中文档的“电子邮件”数组中,则填写我在该文档中创建的名为'owner_id'的'ownerId'变量。

我再看看在所谓的“用户”另一个集合,其中有一个电子邮件字段。如果我传递的电子邮件值存在于该集合中的某个文档中,则填充使用该文档的_id标识创建的'ownerId'变量。

我有我的查询嵌套在几个'then()'语句。

这里是我的代码:

  Profile.findOne({'emails.email_address':req.body.invited_email}, function(err, result){ 

       if(result) 
        ownerId = result.owner_id; 

      }).then(function(){ 
       User.findOne({'email':req.body.invited_email}, function(err, result2){ 

        if(ownerId !== null) 
         ownerId = result2._id; 
       }) 
      }).then(function(){ 

       console.log(' --------------- THIS IS AN EXISTING EMAIL OWNER ID: ' + ownerId); 

      }) 

结果是不是如我所料。

如果“个人资料”的查询是真实的,找到一个匹配,那么它将控制台和值日志OWNERID。

如果第二个“用户”查询是真实的,但没有匹配的“个人资料”,将控制台登录“空”。我期望它能够控制登录用户结果的_id值。

任何人都可以看到我的逻辑错误?

回答

0

我不会混合回调和承诺。我会建议使用async/await。它使异步代码看起来同步。例如:

let owner_id; 

try { 
    let profile = await Profile.findOne({ 'emails.email_address': req.body.invited_email }); 
    let user = await User.findOne({ 'email': req.body.invited_email }): 

    if (profile) { 
    owner_id = profile.owner_id; 
    } else if (user) { 
    owner_id = user.owner_id; 
    } else { 
    console.log('no owner id found'); 
    } 
} catch(err) { 
    console.log(err); 
} 

的代码包装在try/catch语句来处理错误,就像普通的承诺方法catch()。使用await的功能需要async关键字。

await被用于等待的承诺来完成。不需要回调。你可以看到代码看起来像普通的同步代码。

+0

感谢您的答复米卡,但我得到了以下控制台错误:让轮廓=等待Profile.findOne({“emails.email_address”:req.body.invited_email}); ^^^^^^^ 语法错误:意外的标识 – cnak2

+0

在猫鼬4.x的不是。那么意味着处理的承诺,所以你不需要任何额外的工作,用猫鼬与异步()函数/等待? – cnak2

+0

它是在抱怨等待吗?很难看到代码粘贴到注释中时箭头指向的位置。您需要节点的版本7.6或更高版本以进行异步/等待。如果可以的话,你应该升级到最新版本。然后和异步/等待使用承诺,等待只是让它更容易。 – MikaS