如何在MongoDB中按日期对集合进行排序?


125

我将MongoDB与Node.JS结合使用。我有一个包含日期和其他行的集合。日期是一个JavaScript Date对象。

如何按日期排序此收藏集?


1
simple,collection.find()。sort({datefield:1},function(err,cursor){...}); 或者您也可以使用collection.find()。sort({datefield:-1},function(err,cursor){...});
Atul Jain

请注意,您可能不需要一date列:stackoverflow.com/questions/5125521/…–
phil294

Answers:


186

只需对@JohnnyHK答案进行一些修改

collection.find().sort({datefield: -1}, function(err, cursor){...});

在许多用例中,我们希望返回最新记录(例如最新更新/插入)。


1
您打算在功能中添加什么?Date在2.6.3 上,仅尝试对不具有函数的对象进行排序对我不起作用。
山姆·布莱曼2015年

@SamBrightman该函数只是一个回调。无论您想对查询结果做什么,都可以将该逻辑放入回调中。您可以阅读有关什么是回调及其如何工作以学习基于事件的编程的更多信息。
Sushant Gupta

当然,我知道回调是什么。我只在问题中看到排序要求,所有答案都给出了回调。同时,排序对我不起作用,所以我认为也许您需要在函数中做其他工作。
山姆·布莱曼2015年

1
@SamBrightman哦,好的。为方便起见,您可以明确表示和链接类似collection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta

5
它说sort()只需要1个参数
Jitendra Pancholi

39

按日期排序不需要任何特殊要求。只需按集合的所需日期字段排序。

已针对1.4.28 node.js本机驱动程序进行了更新,可以datefield使用以下任意一种方式升序排列:

collection.find().sort({datefield: 1}).toArray(function(err, docs) {...});
collection.find().sort('datefield', 1).toArray(function(err, docs) {...});
collection.find().sort([['datefield', 1]]).toArray(function(err, docs) {...});
collection.find({}, {sort: {datefield: 1}}).toArray(function(err, docs) {...});
collection.find({}, {sort: [['datefield', 1]]}).toArray(function(err, docs) {...});

'asc''ascending'也可以代替1

降序排序,使用'desc''descending'-1在地方1


我在用户名字段上应用了上述解决方案,它工作正常,但区分大小写如何忽略它?
Rahul Matte

正确的答案(y)
Abdulbarik


16

Sushant Gupta的答案有点过时了,不再起作用了。

以下代码段现在应该像这样:

collection.find({}, {"sort" : ['datefield', 'asc']} ).toArray(function(err,docs) {});


@JohnnyHK甜蜜。我不记得确切的情况,但是去年夏天,我试图让这种方法与Sushant的代码段配合使用,但对我来说却不起作用。可能是因为缺少该toArray部分。
krikara

这实际上是一个错误的答案,它在node.js中给出了错误的结果
David A

12

这为我工作:

collection.find({}, {"sort" : [['datefield', 'asc']]}, function (err, docs) { ... });

使用Node.js,Express.js和Monk



5

使用猫鼬,它很简单:

collection.find().sort('-date').exec(function(err, collectionItems) {
  // here's your code
})

4

要使排序参数起作用,需要附加的Square []括号。

collection.find({}, {"sort" : [['datefield', 'asc']]} ).toArray(function(err,docs) {});

2

如果您的日期格式是这样的:1989年2月14日---->您可能会发现一些问题

您需要像这样使用ISOdate:

var start_date = new Date(2012, 07, x, x, x); 

----->结果------> ISODate(“ 2012-07-14T08:14:00.201Z”)

现在只使用这样的查询:

 collection.find( { query : query ,$orderby :{start_date : -1}} ,function (err, cursor) {...}

而已 :)


2

使用mongoose时,我无法使用'toArray',并收到错误消息:TypeError: Collection.find(...).sort(...).toArray is not a function. 本机MongoDB NodeJS驱动程序(参考)的Cursor类上存在toArray函数。

同时sort只接受一个参数,因此您不能在其中传递函数。

这对我有用(由Emil回答):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
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.