MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Solução alternativa do MongoDB para documento acima de 16 MB?


Para corrigir esse problema, você precisará fazer algumas pequenas alterações em sua estrutura de dados. Ao que parece, para que seus documentos excedam o limite de 16 MB, você deve incorporar os dados do sensor em uma matriz em um único documento.

Eu não sugeriria usar o GridFS aqui, não acredito que seja a melhor solução, e aqui está o porquê.

Existe uma técnica conhecida como bucketing que você pode empregar e que basicamente dividirá as leituras do sensor em documentos separados, resolvendo esse problema para você.

A forma como funciona é esta:

Digamos que eu tenha um documento com algumas leituras incorporadas para um sensor específico que se parece com isso:
{
    _id : ObjectId("xxx"),
    sensor : "SensorName1",
    readings : [
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" }
    ]
}

Com a estrutura acima, já existe uma grande falha, o array de leituras pode crescer exponencialmente, e ultrapassar o limite de 16mb do documento.

Então o que podemos fazer é mudar um pouco a estrutura para ficar assim, para incluir uma propriedade de contagem:
{
    _id : ObjectId("xxx"),
    sensor : "SensorName1",
    readings : [
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" },
        { date : ISODate("..."), reading : "xxx" }
    ],
    count : 3
}

A ideia por trás disso é que, quando você $ empurra sua leitura para seu array embutido, você incrementa ($ inc) a variável de contagem para cada push que é executado. E quando você executa esta operação de atualização (push), você inclui um filtro nesta propriedade "count", que pode ser algo assim:
{ count : { $lt : 500} }

Em seguida, defina suas opções de atualização para que você possa definir "upsert" como "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 }
)

veja aqui para mais informações sobre a atualização do MongoDb e a opção Upsert:

Documentação de atualização do MongoDB

O que acontecerá é que, quando a condição do filtro não for atendida (ou seja, quando não houver nenhum documento existente para este sensor ou a contagem for maior ou igual a 500 - porque você está incrementando cada vez que um item é enviado), um novo documento será criado e as leituras serão agora incorporadas a este novo documento. Portanto, você nunca atingirá o limite de 16 MB se fizer isso corretamente.

Agora, ao consultar o banco de dados para leituras de um determinado sensor, você pode obter vários documentos para esse sensor (em vez de apenas um com todas as leituras nele), por exemplo, se você tiver 10.000 leituras, receberá 20 documentos de volta , cada um com 500 leituras cada.

Você pode então usar o pipeline de agregação e $unwind para filtrar suas leituras como se fossem seus próprios documentos individuais.

Para mais informações sobre descontrair veja aqui, é muito útil

MongoDB Descontrair

Eu espero que isso ajude.