Trong Mongoose, làm thế nào để tôi sắp xếp theo ngày? (node.js)


159

giả sử tôi chạy truy vấn này trong Mongoose:

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

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

Điều này không hiệu quả!

Câu trả lời:


427

Sắp xếp trong Mongoose đã phát triển qua các bản phát hành sao cho một số câu trả lời này không còn giá trị. Kể từ phiên bản 4.1.x của Mongoose, một loại giảm dần trên datetrường có thể được thực hiện theo bất kỳ cách nào sau đây:

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) { ... });

Đối với một sắp xếp tăng dần, bỏ qua các -tiền tố trên phiên bản chuỗi hoặc sử dụng giá trị của 1, aschoặc ascending.


1
+1 để hiển thị hàng tấn các cách khác nhau có thể được thực hiện. Tuy nhiên, tôi không thể tìm thấy trong các tài liệu mà Truy vấn # tìm sẽ có nhiều đối số. Chữ ký là Query#find([criteria], [callback]). Tôi nghĩ có lẽ có một cái bắt tay bí mật nói rằng "tiêu chí" có thể lên đến ba đối số, nhưng nó liệt kê loại là "Đối tượng".
Nateowami

@Nateowami Bạn đang xem sai findphương pháp trong tài liệu. Xem Model.find.
JohnnyHK

1
Bạn đúng. Tôi thấy họ đang sử dụng Module#propertyký hiệu và tìm kiếm #find. Dường như không có cách dễ dàng để điều hướng hoặc tìm kiếm các tài liệu. Tìm kiếm để tìm ra kết quả 187.
Nateowami

1
Bạn cũng có thể sắp xếp theo _idlĩnh vực. Ví dụ: để có được bản ghi gần đây nhất, bạn có thể làm:await db.collection.findOne().sort({ _id: -1 });
Mike K


12

Hôm nay đã xử lý vấn đề này bằng cách sử dụng Mongoose 3.5 (.2) và không có câu trả lời nào giúp tôi giải quyết vấn đề này. Đoạn mã sau đây thực hiện thủ thuật

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

Bạn có thể gửi bất kỳ tham số tiêu chuẩn nào bạn cần find()(ví dụ: trong đó mệnh đề và trường trả về) nhưng không có cuộc gọi lại. Không có cuộc gọi lại, nó trả về một đối tượng Truy vấn mà bạn xâu chuỗi sort(). Bạn cần gọi find()lại (có hoặc không có thêm tham số - không cần bất kỳ lý do hiệu quả nào) sẽ cho phép bạn nhận được kết quả được đặt trong cuộc gọi lại của mình.


4

Tôi làm việc này:

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

Điều này sẽ hiển thị những điều gần đây nhất đầu tiên.


1
$orderbykhông được dùng trong MongoDB 3.2 vì vậy nó không nên được sử dụng nữa.
JohnnyHK

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

Nên làm việc tốt

BIÊN TẬP:

Bạn cũng có thể thử sử dụng điều này nếu bạn gặp lỗi sort() only takes 1 Argument:

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

1
điều này mang lại cho tôi lỗi:Error: sort() only takes 1 Argument
mrid

@LukeXF vui lòng xem câu trả lời cập nhật. tôi hy vọng nó sẽ giúp bạn :)
mrid 7/218

@mrid nó phải giống như: Post.find({}, {'_id': 0}).sort("-date").function(err, posts){});
Mostafa Ghadimi

2

Giải pháp ngắn gọn:

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

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

1

Phương pháp thứ 1 đó không hiệu quả. Nó chỉ bị treo ... Tôi nghĩ rằng đó là do một bản cập nhật trong cầy mangut .... Và phương pháp thứ 2 chỉ là các tài liệu mongo mà tôi biết.
TIMEX

Hàm find () là hàm của MongoDB, không phải Mongoose. Vui lòng đọc trang API Mongoose để biết thêm chi tiết Bạn có thể sử dụng cú pháp được xác định trong tài liệu MongoDB với Mongoose. Đó là lý do tại sao Mongoose không có các truy vấn phân loại hoặc giao nhau.
neebz

0

Bạn cũng có thể sắp xếp theo _idlĩnh vực. Ví dụ: để có được bản ghi gần đây nhất, bạn có thể làm,

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

Nó cũng nhanh hơn nhiều, vì tôi sẵn sàng đặt cược rằng datelĩnh vực của bạn không được lập chỉ mục.

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.