I can't seem to find a proper answer to my question, I have looked all over stackoverflow. Consider a sample code in C# which I'm trying to port to nodejs + mongobd.
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;
What is the best way to do that in node's way ? Just a side node, dbContext will query the DB. The point is to collect all the needed infos, package it and only then send it.
Thanks
EDIT:
This is what I have tried
// 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 );
});
});
});
I post it here for some one else who is making the shift. The idea seems to be that you need to have all the data already collected and filtered before you start iterating and assembling any final result to send over.
Answering my question in the context of having an analogy of C#/Linq DB queries to NodeJS/Mongo. A kind of mapping of the "thinking" way. This is mostly just to understand the shift. A proper implementation would be to use patterns(library) like Promise/Deffered as suggested in the comments to the question by @WiredPrairie.
// 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 );
});
});
});