MongoDB Nested Query Returns Only Last Occuring Result

岁酱吖の 提交于 2020-01-05 03:57:08

问题


Okay, I have this code containing a nested query inside a for loop

var query = records.find({$or:[{starter:data},{receiver:data}]},{});//check the records table for all persons the logged in user has spoken to
    query.sort('-createDate').exec(function (err, docs){
        if(err) throw err;

        for(var i=docs.length-1; i>= 0; i--)
        {

           var starter  = docs[i].starter;
            var receiver = docs[i].receiver;
            var lasttxt = docs[i].lastMessage; 

            if (starter == socket.usernames){
              var target = receiver;
            }else
            {
              var target = starter;
            }

          usersrec.find({username:target},{}).lean().exec(function (errx, docx){
                if(errx) throw errx;

                docx[0].message = lasttxt;
                socket.emit('usernames', docx);
          });
        }
    })

Its meant to get the last message of each person the currently logged in user has spoken to and store in the lasttxt variable. Problem is it only gets the last message of the last user in the database It then then assigns this last message to everyone as their own last msg.

This doesn't affect the database's record. just the client side What am i missing?


回答1:


To navigate the js async, I did some to and fro emitting with socket.io and it worked

on the server side

var query = records.find({$or:[{starter:data},{receiver:data}]},{});//check the records table for all persons the logged in user has spoken to
query.sort('-createDate').exec(function (err, docs){
    if(err) throw err;

    for(var i=docs.length-1; i>= 0; i--)
    {

       var starter  = docs[i].starter;
        var receiver = docs[i].receiver;
        var lasttxt = docs[i].lastMessage; 

        if (starter == socket.usernames){
          var target = receiver;
        }else
        {
          var target = starter;
        }

      var userlast = target+" "+lasttxt;
                socket.emit('lastly', userlast);//Emit the username and last message for the client to emit back here
    }
})

On your client side, Pick up the emitted data

 socket.on('lastly', function(data){//Recieve the data and send right back
                  socket.emit('lastly2', data);
              });

Back on you server side, pick up the data sent back

socket.on('lastly2', function(data){//receive the username and last message to work with

var check = data;
var space = check.indexOf(' ');
var name = check.substr(0, space);
var msg = check.substr(space+1);

usersrec.find({username:name},{}).lean().exec(function (errx, docx){
            if(errx) throw errx;

            docx[0].message = msg;
            socket.emit('usernames', docx);
      });

Yeah its probably unorthodox, but at least it gets the job done. Im open to better suggestion tho



来源:https://stackoverflow.com/questions/40131084/mongodb-nested-query-returns-only-last-occuring-result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!