sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Solución alternativa de MongoDB para documentos de más de 16 MB?

Para solucionar este problema, deberá realizar algunas pequeñas modificaciones en su estructura de datos. Por lo que parece, para que sus documentos excedan el límite de 16 mb, debe incorporar los datos de su sensor en una matriz en un solo documento.

No sugeriría usar GridFS aquí, no creo que sea la mejor solución, y esta es la razón.

Existe una técnica conocida como agrupamiento que podría emplear y que esencialmente dividirá las lecturas de su sensor en documentos separados, resolviendo este problema por usted.

La forma en que funciona es esta:

Digamos que tengo un documento con algunas lecturas incrustadas para un sensor en particular que se ve así:

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

Con la estructura anterior, ya existe una falla importante, la matriz de lecturas podría crecer exponencialmente y superar el límite de documentos de 16 mb.

Entonces, lo que podemos hacer es cambiar la estructura ligeramente para que se vea así, para incluir una propiedad de conteo:

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

La idea detrás de esto es que cuando $insertas tu lectura en tu matriz incrustada, incrementas ($inc) la variable de conteo para cada inserción que se realiza. Y cuando realice esta operación de actualización (empuje), incluiría un filtro en esta propiedad de "recuento", que podría verse así:

{ count : { $lt : 500} }

Luego, configure sus Opciones de actualización para que pueda configurar "upsert" en "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 }
)

consulte aquí para obtener más información sobre MongoDb Update y la opción Upsert:

Documentación de actualización de MongoDB

Lo que sucederá es que, cuando no se cumple la condición del filtro (es decir, cuando no existe un documento para este sensor o el recuento es mayor o igual a 500, porque lo está incrementando cada vez que se envía un elemento), un nuevo Se creará un documento y las lecturas ahora se integrarán en este nuevo documento. Por lo tanto, nunca alcanzará el límite de 16 mb si lo hace correctamente.

Ahora, al consultar la base de datos para las lecturas de un sensor en particular, puede obtener varios documentos para ese sensor (en lugar de solo uno con todas las lecturas), por ejemplo, si tiene 10,000 lecturas, obtendrá 20 documentos de vuelta , cada uno con 500 lecturas cada uno.

A continuación, puede utilizar canalización de agregación y $unwind para filtrar sus lecturas como si fueran sus propios documentos individuales.

Para obtener más información sobre relajarse, consulte aquí, es muy útil

Relajación de MongoDB

Espero que esto ayude.