Nói chung:nếu bạn đang tìm kiếm mà không có thứ tự sắp xếp được chỉ định thì không có thứ tự kết quả nào được đảm bảo.
Ngoài ra, không thể sắp xếp theo một mảng (thậm chí ít hơn nếu bạn muốn sắp xếp một mảng theo một mảng như được mô tả). Một sort () sử dụng so sánh logic để xác định thứ tự tăng dần hoặc giảm dần dựa trên một trường trong tài liệu kết quả của bạn.
Bạn sẽ phải triển khai mọi logic sắp xếp tùy chỉnh mong muốn trong mã ứng dụng của riêng mình.
Một phương pháp hữu ích có thể là tận dụng Khung tổng hợp mới trong MongoDB 2.2 .. cụ thể là khả năng $ thư giãn một mảng thành một luồng tài liệu.
Ví dụ:thiết lập dữ liệu thử nghiệm dưới dạng:
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac946b50571321b2f932b"), "a" : [ 5, 4, 9 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
$in
tìm kiếm trên [2,3] sẽ dẫn đến các tài liệu phù hợp:
> db.matches.find({'a': { $in: [2,3]}})
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }
Với khung tổng hợp, bạn có thể $match
các tài liệu tương tự và sau đó thao tác các kết quả để đạt được một số cách sắp xếp cơ bản:$unwind
các mảng, $sort
chúng, rồi đến $group
những điều này trở lại thành một kết quả:
db.matches.aggregate(
{ $match : {
a: { $in: [2,3] }
}},
{ $unwind : "$a" },
{ $sort: {
"a": -1
}},
{ $group : {
_id: '$_id',
a: { $addToSet: "$a" }
}}
)
Vì vậy, trong ví dụ này, các tài liệu có mảng phù hợp hiện được sắp xếp theo thứ tự tăng dần cho các giá trị mảng:
{
"result" : [
{
"_id" : ObjectId("504ac94eb50571321b2f932c"),
"a" : [ 1, 2, 3]
},
{
"_id" : ObjectId("504ac93fb50571321b2f932a"),
"a" : [ 1, 2, 4 ]
},
{
"_id" : ObjectId("504ac954b50571321b2f932d"),
"a" : [ 3, 7, 9 ]
}
],
"ok" : 1
}