Nếu có thể, tôi khuyên bạn chỉ nên luôn (nhân đôi) lưu trữ giá trị mà bạn muốn sắp xếp. Đặt nó vào mảng và trong trường thứ hai. Bất cứ khi nào bạn đẩy một giá trị mới vào mảng (hoặc lưu trữ mảng), hãy thêm một trường mới tương ứng với "giá trị cuối cùng trong mảng", sau đó lập chỉ mục và sắp xếp trên đó. Trong ví dụ dưới đây, tôi gọi nó là lastR
:
{ "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR": 3 }
{ "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR": 1 }
{ "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR": 10 }
{ "value" : -3, "r" : [ ] }
Tạo chỉ mục:
db.so.ensureIndex({lastR: 1})
Và sau đó sử dụng:
> db.so.find().sort({lastR: 1})
{ "_id" : ObjectId("5203a1c83c5438af60de63a1"), "value" : -3, "r" : [ ] }
{ "_id" : ObjectId("5203a1ad3c5438af60de639f"), "value" : 2, "r" : [ { "v" : 4 }, { "v" : 1 } ], "lastR" : 1 }
{ "_id" : ObjectId("5203a1d33c5438af60de63a2"), "value" : -10, "r" : [ { "v" : 1 }, { "v" : 3 } ], "lastR" : 3 }
{ "_id" : ObjectId("5203a1b73c5438af60de63a0"), "value" : -100, "r" : [ { "v" : 4 }, { "v" : 1 }, { "v" : 10 } ], "lastR" : 10 }
Nó sẽ linh hoạt và có thể mở rộng hơn nhiều so với việc cố gắng sử dụng giải pháp tổng hợp (giải pháp này sẽ có giới hạn 16MB đối với tập kết quả và khiến việc truy xuất các tài liệu phức tạp khi cần xử lý phép chiếu trở nên phức tạp hơn nhiều).