2013-03-03 2 views
1

Я не могу найти правильный ответ на мой вопрос, я просмотрел весь стек 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); 
        }); 
      }); 
    }); 

я его здесь кого-то другого, кто делает сдвиг. Идея состоит в том, что вам нужно иметь все собранные и отфильтрованные данные перед тем, как начать итерацию и собрать окончательный результат для отправки.

+0

Это не сайт преобразования кода. :) Что вы пробовали в узле? Все они выглядят просто (и очень стандартно), за исключением того, что вам нужно иметь дело с асинхронным характером узла как частью вашего дизайна. Сначала прочитайте [здесь] (http://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html). – WiredPrairie

+0

Учитывая асинхронную природу NodeJS, вы можете захотеть найти любимую библиотеку/паттерн Promise/Deferred, чтобы вы могли оптимально запросить и продолжить, когда все значения будут возвращены. – WiredPrairie

+0

@WiredPrairie - спасибо, я посмотрю, что я видел это в сети, но не хотел изобретать колесо, добавляя новые зависимости. Был поиск стандартного способа сделать это без обратных вызовов в callbacks в callbacks и т. Д. В более сложном проекте это может стать очень уродливым. –

ответ

0

Отвечая на мой вопрос в контексте наличия аналогий запросов C#/Linq DB к NodeJS/Mongo. Какое-то отображение «мышления». Это в основном просто для понимания сдвига. Правильной реализацией будет использование шаблонов (библиотеки), таких как Promise/Deffered, как это предлагается в комментариях к вопросу от @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); 
        }); 
      }); 
    }); 
Смежные вопросы