如果可能的话,我建议您始终(双倍)存储要排序的值。将其放入数组和第二个字段中。每当您将新值推送到数组(或存储数组)时,请添加与“数组中的最后一个值”相对应的新字段,然后对其进行索引和排序。在下面的示例中,我将其称为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" : [ ] }
创建索引:
db.so.ensureIndex({lastR: 1})
然后使用:
> 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 }
与尝试使用聚合解决方案相比,它将更加通用和可扩展(聚合解决方案对结果集有 16MB 的限制,并且在需要处理投影时检索复杂文档变得更加复杂)。