Bạn có thể thử chạy hàm so sánh tùy chỉnh với JavaScript gốc sort ()
phương thức trên mảng được trả về từ mã <> cursor.toArray ()
phương pháp:
var order = ["food", "coffee", "grocery"];
var docs = db.collection.find().toArray().sort(function(a, b) {
return order.indexOf(a.category) - order.indexOf(b.category);
});
printjson(docs);
Đầu ra mẫu
[
{
"_id" : "4JW7miNITl",
"category" : "food"
},
{
"_id" : "4Je4kmrrbZ",
"category" : "coffee"
},
{
"_id" : "4JgAh3N86x",
"category" : "coffee"
},
{
"_id" : "4JEEuhNIae",
"category" : "grocery"
}
]
Với phiên bản MongoDB 3.4 mới, bạn sẽ có thể tận dụng việc sử dụng các toán tử MongoDB gốc $addFields
và $ indexOfArray
trong khuôn khổ tổng hợp.
-
$ addFields
bước đường dẫn cho phép bạn$ dự án
các trường mới vào tài liệu hiện có mà không cần biết tất cả các trường hiện có khác. -
$ indexOfArray
biểu thức trả về vị trí của một phần tử cụ thể trong một mảng nhất định.
Vì vậy, tổng thể lại, bạn có thể thử hoạt động tổng hợp sau (với MongoDB 3.4):
var order = ["food", "coffee", "grocery"],
projection = {
"$addFields" : {
"__order" : { "$indexOfArray" : [ order, "$category" ] }
}
},
sort = { "$sort" : { "__order" : 1 } };
db.collection.aggregate([ projection, sort]);