MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Soluzione alternativa MongoDB per documenti di dimensioni superiori a 16 MB?

Per risolvere questo problema dovrai apportare alcune piccole modifiche alla struttura dei dati. A quanto pare, affinché i tuoi documenti superino il limite di 16 MB, devi incorporare i dati del sensore in un array in un unico documento.

Non suggerirei di utilizzare GridFS qui, non credo che sia la soluzione migliore, ed ecco perché.

È possibile utilizzare una tecnica nota come bucketing che essenzialmente dividerà le letture del sensore in documenti separati, risolvendo questo problema per te.

Il modo in cui funziona è questo:

Diciamo che ho un documento con alcune letture incorporate per un particolare sensore che assomiglia a questo:

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

Con la struttura sopra, c'è già un grave difetto, l'array delle letture potrebbe crescere in modo esponenziale e superare il limite del documento di 16 MB.

Quindi quello che possiamo fare è modificare leggermente la struttura in modo che assomigli a questa, per includere una proprietà count:

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

L'idea alla base di questo è che quando $spingi la tua lettura nell'array incorporato, incrementi ($inc) la variabile di conteggio per ogni push che viene eseguito. E quando esegui questa operazione di aggiornamento (push), devi includere un filtro su questa proprietà "count", che potrebbe assomigliare a questa:

{ count : { $lt : 500} }

Quindi, imposta le tue Opzioni di aggiornamento in modo da poter impostare "upsert" su "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 }
)

vedere qui per maggiori informazioni su MongoDb Update e l'opzione Upsert:

Documentazione di aggiornamento di MongoDB

Quello che accadrà è, quando la condizione del filtro non è soddisfatta (cioè quando non c'è alcun documento esistente per questo sensore, o il conteggio è maggiore o uguale a 500 - perché lo stai incrementando ogni volta che un elemento viene spinto), un nuovo verrà creato il documento e le letture saranno ora incorporate in questo nuovo documento. Quindi non raggiungerai mai il limite di 16 MB se lo fai correttamente.

Ora, quando si interroga il database per le letture di un particolare sensore, è possibile recuperare più documenti per quel sensore (invece di uno solo con tutte le letture al suo interno), ad esempio, se si dispone di 10.000 letture, si ottengono indietro 20 documenti , ciascuno con 500 letture ciascuno.

Puoi quindi utilizzare la pipeline di aggregazione e $unwind per filtrare le tue letture come se fossero documenti individuali.

Per ulteriori informazioni su come rilassarsi, vedere qui, è molto utile

MongoDB rilassati

Spero che questo aiuti.