Mongoose использует собственный драйвер Монго снизу, а это в свою очередь, использует пул соединений - Я считаю, что по умолчанию 5 подключений (Проверьте here).
Таким образом ваше соединение мангуста будет использовать до 5 одновременных соединений, если у него есть одновременные запросы.
И так как оба user.save
и User.find
являются асинхронными, они будут выполняться одновременно. Так что ваша «программа» говорит узел:
1. Ok, you need to shoot a `save` request for this user.
2. Also, you need to fire this `find` request.
Среда узел считывает эти, не проходит через всю вашу функцию (пока return
). Затем он смотрит на это ноты:
- я должен был назвать это
save
- мне нужно вызвать этот
find
- Эй, Монго родной драйвер (который написан на C++) - вот две задачи для тебя!
- , а затем гонщик mongo отправляет первый запрос. И он видит, что разрешено открывать больше подключений, затем один, так и есть, а также запускает второй запрос, не дожидаясь завершения первого.
Если вы назвали find
внутри обратного вызова для save
, было бы последовательным, и водитель, вероятно, повторно использовать соединение это уже было.
Пример:
// open the first connection
user.save(function(err) {
if (err) {
console.log('I always do this super boring error check:', err);
return;
}
// Now that the first request is done, we fire the second one, and
// we probably end up reusing the connection.
User.find(/*...*/);
});
Или подобное с обещаниями:
user.save().exec().then(function(){
return User.find(query);
})
.then(function(users) {
console.log(users);
})
.catch(function(err) {
// if either fails, the error ends up here.
console.log(err);
});
Кстати, вы можете сказать, мангуст использовать только одно соединение, если вам нужно, по какой-то причине:
let connection = mongoose.createConnection(dbUrl, {server: {poolSize: 1}});
Это было бы его сутью.
Подробнее о MongoLab blog и Mongoose website.
Спасибо за удивительное объяснение! –
Хотелось бы добавить, что для клиента нет ничего необычного пула подключений _much_ больше, чем сотни или даже тысячи. –
@MarkusWMahlberg возможно, но я думал, что _client_ с сотнями соединений будет не так часто. Думаю, зависит от прецедента. – Zlatko