在猫鼬中,如何按日期排序?(node.js)


160

假设我在猫鼬中运行此查询:

Room.find({}, function(err,docs){

}).sort({date:-1}); 

这行不通!

Answers:


429

在发行版本中,按猫鼬排序已得到发展,因此其中某些答案不再有效。从Mongoose 的4.1.x版本开始,date可以通过以下任何一种方式对字段进行降序排序:

Room.find({}).sort('-date').exec(function(err, docs) { ... });
Room.find({}).sort({date: -1}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'desc'}).exec(function(err, docs) { ... });
Room.find({}).sort({date: 'descending'}).exec(function(err, docs) { ... });
Room.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Room.find({}, null, {sort: '-date'}, function(err, docs) { ... });
Room.find({}, null, {sort: {date: -1}}, function(err, docs) { ... });

对于升序排序,省略了-对字符串版本或使用值的前缀1ascascending


1
+1用于显示大量可以完成的方式。但是,我在文档中找不到Query#find将接受这么多参数。签名是Query#find([criteria], [callback])。我以为可能有一些秘密握手,说“条件”最多可以包含三个参数,但是将类型列为“对象”。
Nateowami '17

@Nateowami您正在find文档中查看错误的方法。请参阅Model.find
JohnnyHK '17

1
你是对的。我看到他们正在使用该Module#property符号并进行搜索#find。似乎没有简单的方法可以浏览或搜索文档。搜索find产生187个结果。
Nateowami

2
您也可以按_id字段排序。例如,要获取最新记录,您可以执行以下操作:await db.collection.findOne().sort({ _id: -1 });
Mike K


12

今天一直使用Mongoose 3.5(.2)处理此问题,没有一个答案可以帮助我解决此问题。以下代码片段可以解决问题

Post.find().sort('-posted').find(function (err, posts) {
    // user posts array
});

您可以发送所需的任何标准参数 find()(例如where子句和return字段),但不发送回调。如果没有回调,它将返回您链接的Query对象sort()。您需要find()再次调用(带有或不带有更多参数-出于效率原因不需要任何参数),这将允许您在回调中获取结果集。


4

我这样做:

Data.find( { $query: { user: req.user }, $orderby: { dateAdded: -1 } } function ( results ) {
    ...
})

这将首先显示最新的信息。


1
$orderby在MongoDB 3.2中已弃用,因此不应再使用。
JohnnyHK '16

4
Post.find().sort({date:-1}, function(err, posts){
});

应该也可以

编辑:

如果出现错误,也可以尝试使用此方法sort() only takes 1 Argument

Post.find({}, {
    '_id': 0,    // select keys to return here
}, {sort: '-date'}, function(err, posts) {
    // use it here
});

1
这给了我错误:Error: sort() only takes 1 Argument
凌晨

@LukeXF,请参阅更新的答案。我希望它能对您
有所

@mrid,它应该像是: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi

2

简短的解决方案:

const query = {}
const projection = {}
const options = { sort: { id: 1 }, limit: 2, skip: 10 }

Room.find(query, projection, options).exec(function(err, docs) { ... });

1

第一种方法不起作用。它只是挂起...我认为这是由于猫鼬的更新...。第二种方法只是我所知道的mongo文档。
TIMEX

find()函数是MongoDB的函数,而不是Mongoose。请阅读Mongoose API页面以获取更多详细信息。Mongoose可以使用MongoDB文档中定义的语法。这就是为什么Mongoose没有自己的排序或相交查询的原因。
neebz 2011年

0

您也可以按_id字段排序。例如,要获取最新记录,您可以执行以下操作:

const mostRecentRecord = await db.collection.findOne().sort({ _id: -1 });

它也要快得多,因为我很乐意打赌您的date字段未编入索引。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.