如何在MongoDB中进行收集?

我们在Node.JS中有以下查询

mongo.connect('mongodb://XXX:XXX@ds054XXX.mlab.com:54289/XXXdb', function (err, db) { var collection = db.collection('chatmessages') var stream = collection.find().sort({ _id: -1 }).limit(20).stream(); stream.on('data', function (chat) { socket.emit('user message', chat.content, chat.dateCreated); }); }); 

如您所见,查询是最近input的20条logging的集合。 但是从这个结果来看,我们想在_id中再次求助于1,所以在列表中我们将有55到75的ID(顺序)。 所以最后一个总是在底部。

我们如何再次实现这一目标?

您需要使用聚合框架。

 mongo.connect('mongodb://XXX:XXX@ds054XXX.mlab.com:54289/XXXdb', function (err, db) { var collection = db.collection('chatmessages') var stream = collection.aggregate([ { "$sort": { "_id": -1}}, { "$limit": 20 }, { "$sort": { "_id": 1 }} ]); stream.on('data', function (chat) { socket.emit('user message', chat.content, chat.dateCreated); }); }); 

最简单的做法是颠倒查询返回的logging的顺序。 所以,而不是得到一个stream,将响应转换为数组,并使用reverse()函数,以颠倒其中的logging的顺序,然后通过套接字发送!

 mongo.connect('mongodb://XXX:XXX@ds054XXX.mlab.com:54289/XXXdb', function (err, db) { var collection = db.collection('chatmessages') collection.find().sort({ _id: _1 }).limit(20).toArray(function(err, docs) { if (err) { // handle error } docs.reverse(); // <-- This will reverse the order of records returned! // Send the the array of records through socket. socket.emit('user message', docs) }) });