嵌套查询两个不同集合的奇怪结果
问题描述:
我需要在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值。
任何人都可以看到我的逻辑错误?
答
我不会混合回调和承诺。我会建议使用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
被用于等待的承诺来完成。不需要回调。你可以看到代码看起来像普通的同步代码。
感谢您的答复米卡,但我得到了以下控制台错误:让轮廓=等待Profile.findOne({“emails.email_address”:req.body.invited_email}); ^^^^^^^ 语法错误:意外的标识 – cnak2
在猫鼬4.x的不是。那么意味着处理的承诺,所以你不需要任何额外的工作,用猫鼬与异步()函数/等待? – cnak2
它是在抱怨等待吗?很难看到代码粘贴到注释中时箭头指向的位置。您需要节点的版本7.6或更高版本以进行异步/等待。如果可以的话,你应该升级到最新版本。然后和异步/等待使用承诺,等待只是让它更容易。 – MikaS