Làm cách nào để sắp xếp bộ sưu tập theo ngày trong MongoDB?


125

Tôi đang sử dụng MongoDB với Node.JS. Tôi có một bộ sưu tập chứa một ngày và các hàng khác. Ngày là một Dateđối tượng JavaScript .

Làm thế nào tôi có thể sắp xếp bộ sưu tập này theo ngày?


1
đơn giản, Collection.find (). sort ({datefield: 1}, function (err, con trỏ) {...}); hoặc bạn cũng có thể sử dụng bộ sưu tập.find (). sort ({datefield: -1}, function (err, con trỏ) {...});
Atul Jain

Lưu ý rằng bạn có thể không cần một datecột: stackoverflow.com/questions/5125521/ trên
phil294

Câu trả lời:


185

Chỉ cần sửa đổi một chút để trả lời @JohnnyHK

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

Trong nhiều trường hợp sử dụng, chúng tôi muốn có các bản ghi mới nhất được trả về (như đối với các bản cập nhật / chèn mới nhất).


1
Bạn dự định đặt chức năng gì? Chỉ cố gắng sắp xếp trên Datecác đối tượng mà không có chức năng là không hoạt động đối với tôi trên 2.6.3.
Sam Brightman

@SamBrightman Chức năng đó chỉ là một cuộc gọi lại. Bất cứ điều gì bạn muốn làm với kết quả truy vấn, bạn đặt logic đó vào trong cuộc gọi lại của bạn. Bạn có thể đọc thêm về các cuộc gọi lại là gì và cách chúng hoạt động để học lập trình dựa trên sự kiện.
Sushant Gupta

Chắc chắn, tôi biết một cuộc gọi lại là gì. Tôi chỉ thấy yêu cầu sắp xếp trong câu hỏi và tất cả các câu trả lời đưa ra cuộc gọi lại. Đồng thời, việc sắp xếp không hiệu quả với tôi, vì vậy tôi nghĩ có lẽ bạn phải thực hiện thêm công việc trong hàm.
Sam Brightman

1
@SamBrightman ơi được rồi. Để thuận tiện, bạn có thể rõ ràng và xâu chuỗi nhưcollection.find().sort(...).exec(function(err, cursor) {})
Sushant Gupta

5
nó nói sort () chỉ mất 1 Đối số
Jitendra Pancholi

39

Sắp xếp theo ngày không yêu cầu gì đặc biệt. Chỉ cần sắp xếp theo trường ngày mong muốn của bộ sưu tập.

Được cập nhật cho trình điều khiển gốc 1.4.28 node.js, bạn có thể sắp xếp tăng dần datefieldbằng cách sử dụng bất kỳ cách nào sau đây:

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'hoặc 'ascending'cũng có thể được sử dụng thay cho 1.

Để loại giảm dần, sử dụng 'desc', 'descending'hoặc -1ở vị trí của 1.


Tôi đang áp dụng giải pháp trên trên trường tên người dùng, Nó hoạt động tốt nhưng phân biệt chữ hoa chữ thường Làm thế nào để bỏ qua nó?
Rahul Matte

Câu trả lời đúng với nhiều cách (y)
abdulbarik

28
db.getCollection('').find({}).sort({_id:-1}) 

Điều này sẽ sắp xếp bộ sưu tập của bạn theo thứ tự giảm dần dựa trên ngày chèn


16

Câu trả lời của Sushant Gupta hơi lỗi thời và không còn hiệu quả nữa.

Đoạn mã sau nên như thế này ngay bây giờ:

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


@JohnnyHK Ngọt ngào. Tôi không nhớ kịch bản chính xác, nhưng mùa hè năm ngoái tôi đã cố gắng để làm việc với đoạn trích của Sushant và nó không hoạt động với tôi. Có lẽ đó là vì nó thiếu toArraymột phần.
krikara

Đây thực sự là một câu trả lời sai, nó cho kết quả sai trong node.js
David A

12

Điều này làm việc cho tôi:

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

Sử dụng Node.js, Express.js và Monk



5

Với cầy mangut đơn giản như:

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

4

Hình vuông bổ sung [] Giá đỡ là cần thiết để sắp xếp tham số để hoạt động.

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

2

nếu định dạng ngày của bạn là như thế này: 14/02/1989 ----> bạn có thể tìm thấy một số vấn đề

bạn cần sử dụng ISOdate như thế này:

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

-----> kết quả ------> ISODate ("2012-07-14T08: 14: 00.201Z")

Bây giờ chỉ cần sử dụng truy vấn như thế này:

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

đó là nó :)


2

Với cầy mangut, tôi không thể sử dụng 'toArray' và đã gặp lỗi: TypeError: Collection.find(...).sort(...).toArray is not a function. Hàm toArray tồn tại trên lớp Con trỏ từ trình điều khiển NodeJS gốc MongoDB ( tham chiếu ).

Đồng thời sắp xếp chỉ chấp nhận một tham số, vì vậy bạn không thể truyền chức năng của mình vào bên trong nó.

Điều này làm việc cho tôi (như được trả lời bởi Emil ):

collection.find().sort('-date').exec(function(error, result) {
  // Your code
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.