格式 -
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); });
});});
如何从排序限制中撤消结果?非常感谢你。
答案 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连接上测试这个。经过测试,确保排队适用于您的意图。让我知道是否有错误,我可以编辑以帮助下一个。