sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB-lösning för dokument över 16 MB?

För att åtgärda detta problem måste du göra några små ändringar i din datastruktur. För att dina dokument ska överskrida gränsen på 16 MB måste du bädda in dina sensordata i en array i ett enda dokument.

Jag skulle inte föreslå att du använder GridFS här, jag tror inte att det är den bästa lösningen, och här är varför.

Det finns en teknik som kallas bucketing som du kan använda som i huvudsak delar upp dina sensoravläsningar i separata dokument och löser detta problem åt dig.

Så här fungerar det:

Låt oss säga att jag har ett dokument med några inbäddade avläsningar för en viss sensor som ser ut så här:

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

Med strukturen ovan finns det redan ett stort fel, avläsningsmatrisen kan växa exponentiellt och överskrida dokumentgränsen på 16 MB.

Så vad vi kan göra är att ändra strukturen något så att den ser ut så här, för att inkludera en count-egenskap:

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

Tanken bakom detta är att när du $skjuter in din läsning i din inbäddade array, ökar du ($inc) räkningsvariabeln för varje push som utförs. Och när du utför den här uppdateringsoperationen (push), skulle du inkludera ett filter på den här "count"-egenskapen, som kan se ut ungefär så här:

{ count : { $lt : 500} }

Ställ sedan in dina uppdateringsalternativ så att du kan ställa in "upsert" till "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 }
)

se här för mer information om MongoDb Update och alternativet Upsert:

MongoDB uppdateringsdokumentation

Det som kommer att hända är när filtervillkoret inte är uppfyllt (dvs. när det antingen inte finns något befintligt dokument för den här sensorn, eller när antalet är större eller lika med 500 - eftersom du ökar det varje gång ett objekt trycks), en ny dokument kommer att skapas och läsningarna kommer nu att bäddas in i det nya dokumentet. Så du når aldrig gränsen på 16 MB om du gör det här ordentligt.

Nu, när du frågar databasen för avläsningar av en viss sensor, kan du få tillbaka flera dokument för den sensorn (istället för bara ett med alla avläsningar i den), till exempel, om du har 10 000 avläsningar, kommer du att få tillbaka 20 dokument , var och en med 500 avläsningar vardera.

Du kan sedan använda aggregeringspipeline och $unwind för att filtrera dina avläsningar som om de vore deras egna individuella dokument.

För mer information om att koppla av se här, det är väldigt användbart

MongoDB varva ner

Jag hoppas att detta hjälper.



  1. Enheter att använda för maxdistance och MongoDB?

  2. Mest effektiva sättet att få flera hash i Redis?

  3. Snabbsökning med MongoDB

  4. Golang mgo får tomma föremål