Я не могу найти правильный ответ на мой вопрос, я просмотрел весь стек stackoverflow. Рассмотрим пример кода в C#, который я пытаюсь выполнить для порта nodejs + mongobd.Несколько запросов mongodb с помощью узла
var messageList = new List<MessageHelper>();
foreach(MessageActivation messageToAsk in messagesToAsk)
{
var message = from m in dbContext.Messages where m.Id == messageToAsk.MessageId select m;
var jokeMessage = from m in dbContext.Messages where m.Id == messageToAsk.JokeMessageId select m;
var user = from u in dbContext.Users where u.Id == messageToAsk.SourceUserId select u;
var messageHelper = new MessageHelper();
messageHelper.AskingUserId = user.ToList()[0].Id;
messageHelper.Message = message.ToList()[0];
messageList.Add(messageHelper);
}
return messageList;
Каков наилучший способ сделать это в пути узла? Просто боковой узел, dbContext будет запрашивать БД. Дело в том, чтобы собрать всю необходимую информацию, упаковать ее и только потом отправить ее.
Благодаря
EDIT:
Это то, что я попытался
// collect needed info to make next queries in db
var messageIdList = new Array();
var jokeMessageIdList = new Array();
var sourceUserIdList = new Array();
for(var i=0; i < messagesToAsk.length; i++)
{
messageIdList.push(messagesToAsk[i].MessageId );
jokeMessageIdList.push(jokeMessageId[i].JokeMessageId );
sourceUserIdList .push(jokeMessageId[i].SourceUserId );
}
// make requests to have all the data in place
var messages = App.DataModels.Messages.find({});
messages.where('MessageId').in(messageIdList);
messages.exec(function (err, foundMessages)
{
var jokeMessages = App.DataModels.Messages.find({});
jokeMessages.where('JokeMessageId').in(jokeMessageIdList);
jokeMessages.exec(function (err, foundJokeMessages)
{
var users = App.DataModels.Messages.find({});
users.where('SourceUserId').in(sourceUserIdList);
users.exec(function (err, foundUsers)
{
var messageList = new Array(); // new List<MessageHelper>();
for(var i=0; i < messagesToAsk.length; i++)
{
var message = null;
var jokeMessage = null;
var user = null;
// get the data
for(var j = 0; j < messages.length; j++)
{
if(messages[j].MessageId === messagesToAsk[i].MessageId)
{
message = messages[j];
break;
}
}
for(var k = 0; k < jokeMessages.length; k++)
{
if(jokeMessages[k].JokeMessageId === messagesToAsk[k].JokeMessageId)
{
jokeMessage = jokeMessage[k];
break;
}
}
for(var l = 0; l < users.length; l++)
{
if (users[l].SourceUserId === messagesToAsk[l].SourceUserId)
{
user = users[l];
break;
}
}
var messageHelper =
{
"AskingUserId" : user.Id,
"AskingUserPic" : user.HelperPhoto,
"Message" : message,
"JokeMessage" : message.Type === "1" ? jokeMessage.Content
};
messageList.Add(messageHelper);
}
responseDelegate(response, messageList);
});
});
});
я его здесь кого-то другого, кто делает сдвиг. Идея состоит в том, что вам нужно иметь все собранные и отфильтрованные данные перед тем, как начать итерацию и собрать окончательный результат для отправки.
Это не сайт преобразования кода. :) Что вы пробовали в узле? Все они выглядят просто (и очень стандартно), за исключением того, что вам нужно иметь дело с асинхронным характером узла как частью вашего дизайна. Сначала прочитайте [здесь] (http://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html). – WiredPrairie
Учитывая асинхронную природу NodeJS, вы можете захотеть найти любимую библиотеку/паттерн Promise/Deferred, чтобы вы могли оптимально запросить и продолжить, когда все значения будут возвращены. – WiredPrairie
@WiredPrairie - спасибо, я посмотрю, что я видел это в сети, но не хотел изобретать колесо, добавляя новые зависимости. Был поиск стандартного способа сделать это без обратных вызовов в callbacks в callbacks и т. Д. В более сложном проекте это может стать очень уродливым. –