2013-03-03 2 views
1

나는 내 질문에 대한 적절한 대답을 찾을 수없는 것 같아, 나는 stackoverflow 온통 보였다. nodejs + mongobd로 포트하려고하는 C#의 샘플 코드를 생각해보십시오.노드를 사용하여 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는 DB를 쿼리합니다. 요점은 필요한 모든 정보를 수집하고 패키지화 한 다음 전송하는 것입니다.

감사

편집 :

이 내가 나는 변화를 만드는 다른 어떤 사람을 위해 여기에 게시

// 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

이것은 코드 변환 사이트가 아닙니다. :) Node에서 무엇을 시도 했습니까? 그것들은 모두 당신의 디자인의 일부로서 Node의 비동기 성질을 다룰 필요가 있다는 것을 제외하고는 모두 똑바로 보입니다. 먼저 [here] (http://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html)를 읽으십시오. – WiredPrairie

+0

NodeJS의 비동기 특성을 고려하면 좋아하는 약속/지연 라이브러리/패턴을 찾아 모든 값이 반환 될 때 최적으로 쿼리하고 계속할 수 있습니다. – WiredPrairie

+0

@WiredPrairie - 그걸 들여다 볼께 감사합니다. 그물에서 이걸 보았으나, 새로운 의존성을 추가하여 바퀴를 발명하고 싶지 않았습니다. 콜백 등에서 콜백 내에서 콜백을하지 않고 표준 방법을 찾고있었습니다. 더 복잡한 프로젝트에서는 매우 빨리 못 생길 수 있습니다. –

답변

0

NodeJS/Mongo에 대한 C#/Linq DB 쿼리의 유추와 관련하여 내 질문에 대답합니다. "사고"방식의 일종의 매핑. 이것은 대부분 교대를 이해하기위한 것입니다. 적절한 구현은 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); 
        }); 
      }); 
    });