MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Solution de contournement MongoDB pour les documents de plus de 16 Mo ?

Pour résoudre ce problème, vous devrez apporter quelques petites modifications à votre structure de données. À première vue, pour que vos documents dépassent la limite de 16 Mo, vous devez intégrer les données de votre capteur dans un tableau dans un seul document.

Je ne suggérerais pas d'utiliser GridFS ici, je ne pense pas que ce soit la meilleure solution, et voici pourquoi.

Il existe une technique connue sous le nom de regroupement que vous pouvez utiliser et qui divisera essentiellement les lectures de vos capteurs en documents séparés, résolvant ce problème pour vous.

Voici comment cela fonctionne :

Disons que j'ai un document avec des lectures intégrées pour un capteur particulier qui ressemble à ceci :

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

Avec la structure ci-dessus, il y a déjà un défaut majeur, le tableau des lectures pourrait croître de façon exponentielle et dépasser la limite de 16 Mo de document.

Donc, ce que nous pouvons faire, c'est modifier légèrement la structure pour qu'elle ressemble à ceci, pour inclure une propriété count :

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

L'idée derrière cela est que lorsque vous poussez $ votre lecture dans votre tableau intégré, vous incrémentez ($inc) la variable de comptage pour chaque poussée effectuée. Et lorsque vous effectuez cette opération de mise à jour (push), vous incluez un filtre sur cette propriété "count", qui pourrait ressembler à ceci :

{ count : { $lt : 500} }

Ensuite, définissez vos options de mise à jour afin de pouvoir définir "upsert" sur "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 }
)

voir ici pour plus d'informations sur la mise à jour de MongoDb et l'option Upsert :

Documentation de mise à jour de MongoDB

Ce qui se passera, c'est que lorsque la condition de filtre n'est pas remplie (c'est-à-dire lorsqu'il n'y a pas de document existant pour ce capteur, ou que le nombre est supérieur ou égal à 500 - parce que vous l'incrémentez à chaque fois qu'un élément est poussé), un nouveau document sera créé, et les lectures seront désormais intégrées dans ce nouveau document. Ainsi, vous n'atteindrez jamais la limite de 16 Mo si vous le faites correctement.

Maintenant, lorsque vous interrogez la base de données pour les lectures d'un capteur particulier, vous pouvez récupérer plusieurs documents pour ce capteur (au lieu d'un seul avec toutes les lectures), par exemple, si vous avez 10 000 lectures, vous obtiendrez 20 documents en retour , chacun avec 500 lectures chacun.

Vous pouvez ensuite utiliser le pipeline d'agrégation et $unwind pour filtrer vos lectures comme s'il s'agissait de leurs propres documents individuels.

Pour plus d'informations sur le dénouement voir ici, c'est très utile

Déroulement de MongoDB

J'espère que cela vous aidera.