1

私は私の質問に対する適切な答えを見つけることができないようです、私はstackoverflow全体を見てきました。nodejs + mongobdに移植しようとしているC#のサンプルコードを考えてみましょう。

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 );
                    });
            });
    });

シフトをしている他の誰かのためにここに投稿します。送信する最終結果の反復と組み立てを開始する前に、すべてのデータをすでに収集してフィルタリングする必要があるという考えのようです。

4

1 に答える 1

0

C#/Linq DB クエリを NodeJS/Mongo に例えるという文脈で私の質問に答えます。「考える」方法の一種のマッピング。これは主に、シフトを理解するためだけのものです。適切な実装は、@WiredPrairie による質問へのコメントで提案されているように、Promise/Deffered のようなパターン (ライブラリ) を使用することです。

// 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 );
                    });
            });
    });
于 2013-03-07T12:05:17.663 に答える