MongoDB Nested Query Returns Only Last Occuring Re

2019-08-05 08:10发布

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条回答
小情绪 Triste *
2楼-- · 2019-08-05 08:53

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

查看更多
登录 后发表回答