Làm thế nào để sắp xếp trong cầy mangut?


154

Tôi tìm thấy không có tài liệu cho sửa đổi sắp xếp. Cái nhìn sâu sắc duy nhất là trong các bài kiểm tra đơn vị: spec.lib.query.js # L12

writer.limit(5).sort(['test', 1]).group('name')

Nhưng nó không hoạt động với tôi:

Post.find().sort(['updatedAt', 1]);

7
Đọc câu trả lời này cho một câu trả lời lên đến ngày.
Francisco Presencia

Câu trả lời:


157

Trong Mongoose, một loại có thể được thực hiện theo bất kỳ cách nào sau đây:

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

5
Đây gần như là một bản sao thẳng của câu trả lời được liên kết bởi Francisco Presencia. Thật không may, các câu trả lời được bình chọn cao nhất đã lỗi thời và dài không cần thiết.
iwein

2
Điều này không hoàn toàn chính xác như ngày nay. {sort: [['date', 1]]}sẽ không hoạt động, nhưng .sort([['date', -1]])sẽ làm việc. Xem câu trả lời này: stackoverflow.com/a/15081087/404699
steampowered

@steampowered cảm ơn, tôi sẽ thực hiện chỉnh sửa, bạn rất vui lòng cho tôi biết hoặc chỉnh sửa nếu tôi hiểu sai.
iwein

135

Đây là cách tôi sắp xếp để làm việc trong mongoose 2.3.0 :)

// Find First 10 News Items
News.find({
    deal_id:deal._id // Search Filters
},
['type','date_added'], // Columns to Return
{
    skip:0, // Starting Row
    limit:10, // Ending Row
    sort:{
        date_added: -1 //Sort by Date Added DESC
    }
},
function(err,allNews){
    socket.emit('news-load', allNews); // Do something with the array of 10 objects
})

7
trong mongoose 3 bạn không thể sử dụng Arrayđể chọn trường nữa - nó phải StringhoặcObject
pkyeck

4
btw, nếu bạn muốn tất cả các lĩnh vực, bạn chỉ có thể kéo nullvào phần đó (ít nhất là trong 3,8)
MalcolmOcean

63

Kể từ Mongoose 3.8.x:

model.find({ ... }).sort({ field : criteria}).exec(function(err, model){ ... });

Ở đâu:

criteriacó thể asc, desc, ascending, descending, 1, hoặc-1


52

CẬP NHẬT:

Post.find().sort({'updatedAt': -1}).all((posts) => {
  // do something with the array of posts
});

Thử:

Post.find().sort([['updatedAt', 'descending']]).all((posts) => {
  // do something with the array of posts
});

13
Trong Mongoose mới nhất (2.4.10), nó .sort("updatedAt", -1).
Marcel Jackwerth

43
Trong hơn mới nhất Mongoose (3.5.6-trước, nhưng tôi khá chắc chắn rằng nó có giá trị cho tất cả các 3.x) nó .sort({updatedAt: -1})hay .sort('-updatedAt').
Andreas Hultgren

2
Sau đó, bạn nên sử dụng exec(function (posts) {…thay vìall
Buzut

Tôi đã có một chiếc all() must be used after where() when called with these argumentsMongoose 4.6.5 ...
Dam Fa

25

Mongoose v5.4.3

sắp xếp theo thứ tự tăng dần

Post.find({}).sort('field').exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'asc' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'ascending' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: 1 }).exec(function(err, docs) { ... });

Post.find({}, null, {sort: { field : 'asc' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : 'ascending' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : 1 }}), function(err, docs) { ... });

sắp xếp theo thứ tự giảm dần

Post.find({}).sort('-field').exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'desc' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: 'descending' }).exec(function(err, docs) { ... });
Post.find({}).sort({ field: -1 }).exec(function(err, docs) { ... });


Post.find({}, null, {sort: { field : 'desc' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : 'descending' }}), function(err, docs) { ... });
Post.find({}, null, {sort: { field : -1 }}), function(err, docs) { ... });

Để biết chi tiết: https://mongoosejs.com/docs/api.html#query_Query-sort


23

Cập nhật

Có một bài viết tốt hơn nếu điều này gây nhầm lẫn cho mọi người; kiểm tra tìm tài liệucách truy vấn hoạt động trong hướng dẫn sử dụng cầy mangut. Nếu bạn muốn sử dụng api trôi chảy, bạn có thể nhận được một đối tượng truy vấn bằng cách không cung cấp một cuộc gọi lại cho find()phương thức, nếu không bạn có thể chỉ định các tham số như tôi phác thảo dưới đây.

Nguyên

Đưa ra một modelđối tượng, theo các tài liệu trên Model , đây là cách nó có thể hoạt động cho 2.4.1:

Post.find({search-spec}, [return field array], {options}, callback)

Các search specđối tượng mong đợi một đối tượng, nhưng bạn có thể vượt qua nullhoặc một đối tượng trống.

Tham số thứ hai là danh sách trường dưới dạng một chuỗi các chuỗi, vì vậy bạn sẽ cung cấp ['field','field2']hoặc null.

Thông số thứ ba là các tùy chọn dưới dạng một đối tượng, bao gồm khả năng sắp xếp tập kết quả. Bạn sẽ sử dụng { sort: { field: direction } }nơi fieldlà chuỗi fieldname test(trong trường hợp của bạn) và directionlà một số nơi 1tăng dần và -1được desceding.

Tham số cuối cùng ( callback) là hàm gọi lại nhận bộ sưu tập tài liệu được trả về bởi truy vấn.

Việc Model.find()triển khai (tại phiên bản này) thực hiện phân bổ trượt các thuộc tính để xử lý các tham số tùy chọn (điều khiến tôi bối rối!):

Model.find = function find (conditions, fields, options, callback) {
  if ('function' == typeof conditions) {
    callback = conditions;
    conditions = {};
    fields = null;
    options = null;
  } else if ('function' == typeof fields) {
    callback = fields;
    fields = null;
    options = null;
  } else if ('function' == typeof options) {
    callback = options;
    options = null;
  }

  var query = new Query(conditions, options).select(fields).bind(this, 'find');

  if ('undefined' === typeof callback)
    return query;

  this._applyNamedScope(query);
  return query.find(callback);
};

HTH


để chiếu: chúng ta cần cung cấp chuỗi chứa các tên cột được phân tách bằng dấu cách.
maddy

11

Đây là cách tôi sắp xếp để làm việc trong mongoose.js 2.0.4

var query = EmailModel.find({domain:"gmail.com"});
query.sort('priority', 1);
query.exec(function(error, docs){
  //...
});

10

Xâu chuỗi với giao diện xây dựng truy vấn trong Mongoose 4.

// Build up a query using chaining syntax. Since no callback is passed this will create an instance of Query.
var query = Person.
    find({ occupation: /host/ }).
    where('name.last').equals('Ghost'). // find each Person with a last name matching 'Ghost'
    where('age').gt(17).lt(66).
    where('likes').in(['vaporizing', 'talking']).
    limit(10).
    sort('-occupation'). // sort by occupation in decreasing order
    select('name occupation'); // selecting the `name` and `occupation` fields


// Excute the query at a later time.
query.exec(function (err, person) {
    if (err) return handleError(err);
    console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation) // Space Ghost is a talk show host
})

Xem các tài liệu để biết thêm về các truy vấn.


4

với phiên bản hiện tại của mongoose (1.6.0) nếu bạn chỉ muốn sắp xếp theo một cột, bạn phải thả mảng và chuyển đối tượng trực tiếp đến hàm sort ():

Content.find().sort('created', 'descending').execFind( ... );

mất một thời gian để có được điều này :(


Cảm ơn. bài viết của bạn đã giúp tôi. Tôi cũng phải đối mặt với điều này.
dùng644745

4
app.get('/getting',function(req,res){
    Blog.find({}).limit(4).skip(2).sort({age:-1}).then((resu)=>{
        res.send(resu);
        console.log(resu)
        // console.log(result)
    })
})

Đầu ra

[ { _id: 5c2eec3b8d6e5c20ed2f040e, name: 'e', age: 5, __v: 0 },
  { _id: 5c2eec0c8d6e5c20ed2f040d, name: 'd', age: 4, __v: 0 },
  { _id: 5c2eec048d6e5c20ed2f040c, name: 'c', age: 3, __v: 0 },
  { _id: 5c2eebf48d6e5c20ed2f040b, name: 'b', age: 2, __v: 0 } ]

3

Đây là cách tôi quản lý để sắp xếp và điền vào:

Model.find()
.sort('date', -1)
.populate('authors')
.exec(function(err, docs) {
    // code here
})


2

Những người khác làm việc cho tôi, nhưng điều này đã làm:

  Tag.find().sort('name', 1).run(onComplete);

2
Post.find().sort({updatedAt:1}).exec(function (err, posts){
...
});


1

Bắt đầu từ 4.x các phương thức sắp xếp đã được thay đổi. Nếu bạn đang sử dụng> 4.x. Hãy thử sử dụng bất kỳ điều sau đây.

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

0
Post.find().sort('updatedAt').exec((err, post) => {...});

1
Xin chào và chào mừng đến với cộng đồng. Trong khi câu trả lời của bạn có thể cung cấp một giải pháp, một câu trả lời tốt đòi hỏi một số lời giải thích. Vui lòng thêm một số tài liệu tham khảo và một lời giải thích thích hợp.
Panda
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.