gpt4 book ai didi

javascript - Node JS/MongoDB 中的嵌套查询

转载 作者:行者123 更新时间:2023-11-30 08:45:17 26 4
gpt4 key购买 nike

我在 mongo 中的用户列表表是这样设置的:

email: email@email.com, uniqueUrl:ABC, referredUrl: ...

我有以下代码,我在其中查询我的数据库中的所有用户,并针对这些用户中的每一个,找出有多少其他用户的 referredUrl 等于当前用户的唯一 url:

exports.users = function(db) {
return function(req, res) {
db.collection('userlist').find().toArray(function (err, items) {
for(var i = 0; i<= items.length; i++) {
var user = items[i];
console.log(user.email);
db.collection('userlist').find({referredUrl:user.uniqueUrl}).count(function(err,count) {
console.log(count);
});
}
});
};
};

现在我首先记录用户的电子邮件,然后是与用户关联的计数。所以控制台应该是这样的:

bob@bob.com
1
chris@chris.com
3
grant@grant.com
2

相反,它看起来像这样:

bob@bob.com
chris@chris.com
grant@grant.com
1
3
2

这是怎么回事?为什么嵌套查询只在第一个查询完成后才返回?

最佳答案

欢迎使用异步编程和回调。

您期望发生的是一切都按线性顺序工作,但这不是 Node 的工作方式。整个主题在这里有点过于宽泛,但可以继续阅读。

幸运的是驱动程序调用的方法都是process.nextTick的关键,它为您提供了一些可供查找和搜索的内容。但是由于事物排队的自然方式,有一种简单的方法来修复代码。

db.collection('userlist').find().toArray(function(err,items) {
var processing = function(user) {
db.collection('userlist').find({ referredUrl: user.uniqueUrl })
.count(function(err,count) {
console.log( user.email );
console.log( count );
});
};
for( var i = 0; i < items.length; i++) {
var user = items[i];
processing(user);
}
});

当然,这确实是一种过于简单化的解释方式,但请理解,您正在将参数传递给重复的 .find(),然后在那里进行所有输出。

如前所述,幸运的是,一些工作已在 API 函数中为您完成,并且在您添加调用时会维护事件堆栈。但大多数情况下,现在输出调用是一起进行的,而不是在不同的事件集中发生。

对于事件循环和回调的详细解释,我敢肯定那里有比我在这里写的更好的解释。

关于javascript - Node JS/MongoDB 中的嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22496567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com