sql >> Database >  >> NoSQL >> MongoDB

MongoDB-oplossing voor documenten groter dan 16 MB?

Om dit probleem op te lossen, moet u enkele kleine wijzigingen aanbrengen in uw gegevensstructuur. Zoals het er nu uitziet, moet u uw sensorgegevens insluiten in een array in één enkel document om uw documenten de limiet van 16 MB te laten overschrijden.

Ik zou niet aanraden om GridFS hier te gebruiken, ik geloof niet dat dit de beste oplossing is, en dit is waarom.

Er is een techniek die bekend staat als bucketing en die u zou kunnen gebruiken en die uw sensormetingen in wezen opsplitst in afzonderlijke documenten, waardoor dit probleem voor u wordt opgelost.

De manier waarop het werkt is dit:

Laten we zeggen dat ik een document heb met enkele ingesloten meetwaarden voor een bepaalde sensor die er als volgt uitziet:

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

Met de bovenstaande structuur is er al een grote fout, de meetreeks kan exponentieel groeien en de documentlimiet van 16 MB overschrijden.

Dus wat we kunnen doen is de structuur iets veranderen om er zo uit te zien, om een ​​count-eigenschap op te nemen:

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

Het idee hierachter is dat wanneer u $ uw meting in uw embedded array pusht, u de count-variabele ($inc) verhoogt voor elke push die wordt uitgevoerd. En wanneer u deze update (push)-bewerking uitvoert, zou u een filter opnemen op deze "count"-eigenschap, die er ongeveer zo uit zou kunnen zien:

{ count : { $lt : 500} }

Stel vervolgens uw Update-opties zo in dat u "upsert" kunt instellen op "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 }
)

zie hier voor meer informatie over MongoDb Update en de Upsert-optie:

MongoDB-updatedocumentatie

Wat er zal gebeuren is, wanneer niet aan de filtervoorwaarde wordt voldaan (d.w.z. wanneer er geen bestaand document voor deze sensor is, of het aantal groter of gelijk is aan 500 - omdat u het telkens verhoogt wanneer een item wordt gepusht), een nieuwe document wordt gemaakt en de meetwaarden worden nu in dit nieuwe document ingesloten. Je haalt dus nooit de limiet van 16 MB als je dit goed doet.

Als u nu de database doorzoekt naar metingen van een bepaalde sensor, kunt u meerdere documenten voor die sensor terugkrijgen (in plaats van slechts één met alle metingen erin), bijvoorbeeld als u 10.000 metingen heeft, krijgt u 20 documenten terug , elk met 500 metingen.

U kunt vervolgens de aggregatiepijplijn en $unwind gebruiken om uw metingen te filteren alsof het hun eigen individuele documenten zijn.

Zie hier voor meer informatie over ontspannen, het is erg handig

MongoDB Ontspan

Ik hoop dat dit helpt.



  1. Abonneren op Meteor.Users Collection

  2. Meerdere waarden atomair uit de Redis-gegevensstructuur halen?

  3. F# Meerdere attributen CLIMutable DataContract

  4. Mongoose limiet/offset en telling query