2017-11-25 128 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