【问题标题】:MongoDB Nested Query Returns Only Last Occuring ResultMongoDB 嵌套查询仅返回最后出现的结果
【发布时间】:2017-03-01 01:48:56
【问题描述】:

好的,我的这段代码在 for 循环中包含一个嵌套查询

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

它的意思是获取当前登录用户与之交谈的每个人的最后一条消息,并将其存储在lasttxt 变量中。 问题是它只获取数据库中最后一个用户的最后一条消息 然后它将最后一条消息分配给每个人作为他们自己的最后一条消息。

这不会影响数据库的记录。只是客户端 我错过了什么?

【问题讨论】:

  • 如果我在usersrec.find 查询之前执行console.log(lasttxt),它会返回正确的结果。但是当我将lasttxt 变量放在查询中时,它只会得到数据库中该字段的最后一次出现
  • 好的,@chridam 我现在去那里
  • @chridam async 是 female dog 。我通过在客户端和服务器之间发送所需的数据来玩弄套接字。瞧!它奏效了
  • 很高兴您对此进行了排序。您可以在此处发布您的解决方案,以帮助可能遇到同样困境的其他人。

标签: javascript arrays mongodb mongoose socket.io


【解决方案1】:

为了导航 js 异步,我用 socket.io 来回发射了一些,它工作了

在服务器端

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

在您的客户端,获取发出的数据

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

回到你的服务器端,拿起发回的数据

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

是的,它可能是非正统的,但至少它完成了工作。我愿意接受更好的建议

【讨论】:

    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多