Nodejs Mongodb第二个sort()用于第一个sort()结果

时间:2017-07-26 22:43:49

标签: node.js mongodb

想要出现

格式 -

msg - 9
...
msg - 17
msg - 18
msg - 19

从这个功能

mongo.connect(mongourl, function (err, db) {
   var collection = db.collection('chat')
   var stream = collection.find().sort({ _id : -1 }).limit(10).stream();
   stream.on('data', function (chatt) {clients[socket.id].emit('chat message', chatt.content); });     

});});

但是这种排序只给了我 -

msg - 19
msg - 18
msg - 17
...
msg - 9

因为它是一个聊天应用程序,并且最新行需要位于聊天格式的底部。 我尝试将新的排序代码添加到结果中(我是节点新手) - 它再次对整个数据库进行调整,并提供最早的10行。

mongo.connect(mongourl, function (err, db) {
   var collection = db.collection('chat')
   var stream = collection.find().sort({ _id : -1 }).limit(10);
   stream=stream.sort({ _id : 1 }).stream();
   stream.on('data', function (chatt) {clients[socket.id].emit('chat message', chatt.content); });     

});});

如何从排序限制中撤消结果?非常感谢你。

1 个答案:

答案 0 :(得分:0)

至少有两种方法可以做到这一点。 公平警告:我没有在一个实际的MongoDB连接上测试它。但是,这应该让校长跨越。愿部队在你的旅途中与你同在!

仅使用数组:

mongo.connect(mongourl, function (err, db) {
  var collection = db.collection('chat');

  // Get the previous 10 initially.
  var prev10 = collection.find().sort({ _id : -1 }).limit(10).toArray();
  // flush it
  let msg = null;
  while (msg = prev10.pop()) {
    // Remove the last element, which is the first message sent, altering the array in place.
    // Send it to the socket
    client[socket.id].emit('chat_message', msg.content);
  }
});

使用数组作为最初的10,然后流: 这是一个小小的礼物,因为我们试图跳过初始数组提取返回的内容。我不想这样做,但是为什么不试一试?

mongo.connect(mongourl, function (err, db) {
  var collection = db.collection('chat');

  // Get the previous 10 initially.
  var prev10 = collection.find().sort({ _id : -1 }).limit(10).toArray();

  // flush it
  let msg = null;
  let count = 0;
  while (msg = prev10.pop()) {
    // Remove the last element, which is the first message sent, altering the array in place.
    // Send it to the socket
    client[socket.id].emit('chat_message', msg.content);
    // Increment
    count ++;
  }

   // Set up your stream, skipping the message already retrieved
   stream=collection.find({}).sort({ _id : -1 }).skip(count).stream();

   stream.on('data', function (chatt) {
      // Stream each incoming message individually.
      clients[socket.id].emit('chat message', chatt.content);
   });
});

首选,如果您只想使用流而不打扰初始查询: 在这里,您可以返回10,20,100条最近的历史消息,它将始终适应您的需要。延迟始终确保在按照出现顺序(FILO(First-In,Last-Out))返回之前没有新记录要收集。 MongoDB实际上是因为它的结果排序而使你的FIFO成为FILO。所以你通过弹出它返回的数组来改变顺序。

mongo.connect(mongourl, function (err, db) {
  var collection = db.collection('chat');
  let HISTORYCOUNT = 10;
  let DATADELAY = 10;
  let filoQue = [];
  let delayedFlush = null;
  // Set up the stream.
  var stream = collection.find().sort({ _id : -1 }).limit(HISTORYCOUNT).stream();
  // Read data.
  stream.on('data', function (chatt) {
    // New data show up quickly, so it won't flush...
    if (delayedFlush) { clearTimeout(delayedflush); }
    // ...but rather fill the FILO queue.
    filoQue.push(chatt);
    delayedFlush = setTimeout(function() {
      // Empty the first 10 in your preferred order 9 -> 19
      if (filoQue.length > 0) {
      let msg = null;
      while (msg = filoQue.pop();) {
        // Always remove the last element, which will be the first message sent, altering the array in place.
        // Send it to the socket
        client[socket.id].emit('chat_message', msg.content);
      }, DATADELAY);
   });
});

同样,公平警告我没有在ACTUAL MongoDB连接上测试这个。经过测试,确保排队适用于您的意图。让我知道是否有错误,我可以编辑以帮助下一个。