Для этого нет встроенного запроса, вам нужно выполнить итерацию коллекции, собрать размер для каждого документа и отсортировать впоследствии.Вот как это будет работать:
var cursor = db.coll.find();
var doc_size = {};
cursor.forEach(function (x) {
var size = Object.bsonsize(x);
doc_size[x._id] = size;
});
На этом этапе у вас будет хэш-карта с идентификаторами документов в качестве ключей и их размерами в качестве значений.Обратите внимание, что при таком подходе вы будете получать всю коллекцию по проводам.Альтернативой является использование MapReduce и выполнение этого на стороне сервера (внутри mongo):
> function mapper() {emit(this._id, Object.bsonsize(this));}
> function reducer(obj, size_in_b) { return { id : obj, size : size_in_b}; }
>
> var results = db.coll.mapReduce(mapper, reducer, {out : {inline : 1 }}).results
> results.sort(function(r1, r2) { return r2.value - r1.value; })
inline: 1 говорит mongo не создавать временную коллекцию для результатов, все будет храниться в оперативной памяти.
И пример вывода из одной из моих коллекций:
[
{
"_id" : ObjectId("4ce9339942a812be22560634"),
"value" : 1156115
},
{
"_id" : ObjectId("4ce9340442a812be24560634"),
"value" : 913413
},
{
"_id" : ObjectId("4ce9340642a812be26560634"),
"value" : 866833
},
{
"_id" : ObjectId("4ce9340842a812be28560634"),
"value" : 483614
},
...
{
"_id" : ObjectId("4ce9340742a812be27560634"),
"value" : 61268
}
]
>