Как создать динамическое количество (пустых) сегментов в функции агрегации bucketAuto в MongoDB? - PullRequest
0 голосов
/ 31 января 2019

Я храню метаданные о файлах в базе данных 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 }

У меня есть два вопроса по этому поводу:

  1. Поскольку buckets является обязательным параметром (даже если granularity="POWERSOF2" установлено), я не знаю, какое идеальное значение для buckets, потому что я не знаю количество сегментов.Является ли это хорошей стратегией для установки количества сегментов на действительно высокое значение (например, 1024, потому что маловероятно, что я столкнусь с файлом с размером файла> = 2 ^ 1024 байта) или есть способы различить количество сегментовдинамически?
  2. Если вы посмотрите на мой пример с реальными данными, вы увидите, что есть только сегменты со значениями min / max / count, где хотя бы один документ существует в блоке.Можно ли также создать сегменты с пустыми значениями, чтобы, например, {"_id" : {"min": 4096, "max": 8192}, "count": 0} также входил в набор результатов?

И дополнительный вопрос: как MongoDB обрабатывает значения, имеющие значениеровно 2 ^ n, например 1024?Эти значения появляются в двух результирующих наборах (в данном случае в {"min": 512, "max": 1024} и в {"min": 1024, "max": 2048})?Если да, то возможно ли создать несвязанные ведра?

...