簡體   English   中英

如何在 MongoDB 的 bucketAuto 聚合函數中創建動態數量的(空)桶?

[英]How to create dynamic amount of (empty) buckets in MongoDB's bucketAuto aggregation function?

我將有關文件的元數據存儲在 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的理想值是哪個,因為我不知道bucket的數量。 將存儲桶的數量設置為非常高的值是一個好策略(例如 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} )? 如果是這樣,是否可以創建分離的存儲桶?

您的第一個問題似乎表明您實際上並不想使用$bucketAuto而只是$bucket bucketAuto 的全部意義在於它根據所需的計數自動確定桶邊界。 在您的情況下,您似乎知道您希望存儲桶的邊界是什么,並且希望不指定存儲桶的數量。

如果您選擇此選項,那么這也回答了您的第二個問題:在固定存儲桶邊界的情況下,某些存儲桶可能最終為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM