sql >> Databáze >  >> NoSQL >> MongoDB

Řešení MongoDB pro dokument větší než 16 MB?

Chcete-li tento problém vyřešit, budete muset provést několik malých úprav ve vaší datové struktuře. Aby vaše dokumenty překročily limit 16 MB, musíte vkládat data senzoru do pole v jediném dokumentu.

Nedoporučoval bych zde používat GridFS, nevěřím, že je to nejlepší řešení, a zde je důvod.

Existuje technika známá jako bucketing, kterou můžete použít a která v podstatě rozdělí údaje ze senzorů do samostatných dokumentů a tento problém vyřeší za vás.

Funguje to takto:

Řekněme, že mám dokument s několika vloženými hodnotami pro konkrétní senzor, který vypadá takto:

{
    _id : ObjectId("xxx"),
    sensor : "SensorName1",
    readings : [
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" }
    ]
}

S výše uvedenou strukturou již existuje velká chyba, pole čtení by mohlo exponenciálně růst a překročit limit 16 MB pro dokument.

Co tedy můžeme udělat, je mírně změnit strukturu, aby vypadala takto, aby zahrnovala vlastnost count:

{
    _id : ObjectId("xxx"),
    sensor : "SensorName1",
    readings : [
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" }
    ],
    count : 3
}

Myšlenka za tím je, že když $pushnete své čtení do vašeho embedded pole, zvýšíte ($inc) proměnnou count pro každé provedení push. A když provedete tuto operaci aktualizace (push), měli byste zahrnout filtr na tuto vlastnost "count", která by mohla vypadat nějak takto:

{ count : { $lt : 500} }

Poté nastavte Možnosti aktualizace tak, abyste mohli nastavit „upsert“ na „true“:

db.sensorReadings.update(
    { name: "SensorName1", count { $lt : 500} },
    {
        //Your update. $push your reading and $inc your count
        $push: { readings: [ReadingDocumentToPush] }, 
        $inc: { count: 1 }
    },
    { upsert: true }
)

zde najdete další informace o aktualizaci MongoDb a možnosti Upsert:

Dokumentace k aktualizaci MongoDB

Co se stane je, že když podmínka filtru není splněna (tj. když buď neexistuje žádný dokument pro tento senzor, nebo je počet větší nebo roven 500 – protože ho zvyšujete pokaždé, když je položka zatlačena), nový dokument bude vytvořen a načtené hodnoty budou nyní vloženy do tohoto nového dokumentu. Takže nikdy nedosáhnete limitu 16 MB, pokud to uděláte správně.

Nyní můžete při dotazování databáze na hodnoty konkrétního senzoru získat zpět více dokumentů pro tento senzor (namísto pouze jednoho se všemi naměřenými hodnotami), například pokud máte 10 000 měření, získáte zpět 20 dokumentů. , každý s 500 čteními.

Poté můžete použít agregační kanál a $unwind k filtrování naměřených hodnot, jako by to byly jejich vlastní jednotlivé dokumenty.

Více informací o uvolnění naleznete zde, je to velmi užitečné

MongoDB Unwind

Doufám, že to pomůže.



  1. jak mohu vidět, na kterých portech mongo poslouchá z mongo shell?

  2. projekce nefunguje s vyhledávacím dotazem

  3. Jak uložit prvek seznamu do mezipaměti Redis

  4. Zamykání a Redis