Я храню метаданные о файлах в базе данных MongoDB.Одним из свойств является размер файла в байтах, который я использую для гистограммы о размерах файлов.Пример документа выглядит так:
{
"_id" : ObjectId("5c52366eeb3cae00c3896b89"),
"doc_uuid" : "bfa2734a-a262-4b14-a03f-45108ae59fde",
"files" : [
{
"uuid" : "7eca2b9d-61a6-4993-99d1-b23fa0a27197",
"filesize" : 1391908,
...
},
{
"uuid" : "c1277835-ce41-4057-a1ae-d67cc0aa7552",
"filesize" : 4977756,
...
},
]
}
Я хочу создать сегменты для файлов размером 2 ^ n байт.Например:
{"_id" : { "min": 0, "max": 1}, "count": 12},
{"_id" : { "min": 1, "max": 2}, "count": 1},
{"_id" : { "min": 2, "max": 4}, "count": 0},
{"_id" : { "min": 4, "max": 8}, "count": 145},
Для архивации я сейчас создаю конвейер агрегации, который выглядит следующим образом:
db.repositories.aggregate([
{"$match": {doc_uuid:{$in:["bfa2734a-a262-4b14-a03f-45108ae59fde"]}}},
{'$unwind': '$files'},
{'$bucketAuto':
{'groupBy': '$files.filesize',
buckets:16,
granularity: "POWERSOF2"
}
}])
, который отлично работает.Это пример некоторых реальных данных, которые у меня есть:
{ "_id" : { "min" : 8192, "max" : 16384 }, "count" : 16 }
{ "_id" : { "min" : 16384, "max" : 2097152 }, "count" : 1 }
{ "_id" : { "min" : 2097152, "max" : 8388608 }, "count" : 1 }
У меня есть два вопроса по этому поводу:
- Поскольку
buckets
является обязательным параметром (даже если granularity="POWERSOF2"
установлено), я не знаю, какое идеальное значение для buckets
, потому что я не знаю количество сегментов.Является ли это хорошей стратегией для установки количества сегментов на действительно высокое значение (например, 1024, потому что маловероятно, что я столкнусь с файлом с размером файла> = 2 ^ 1024 байта) или есть способы различить количество сегментовдинамически? - Если вы посмотрите на мой пример с реальными данными, вы увидите, что есть только сегменты со значениями min / max / count, где хотя бы один документ существует в блоке.Можно ли также создать сегменты с пустыми значениями, чтобы, например,
{"_id" : {"min": 4096, "max": 8192}, "count": 0}
также входил в набор результатов?
И дополнительный вопрос: как MongoDB обрабатывает значения, имеющие значениеровно 2 ^ n, например 1024?Эти значения появляются в двух результирующих наборах (в данном случае в {"min": 512, "max": 1024}
и в {"min": 1024, "max": 2048}
)?Если да, то возможно ли создать несвязанные ведра?