For at løse dette problem skal du lave nogle små ændringer i din datastruktur. Ved lyden af det, for at dine dokumenter kan overskride grænsen på 16 MB, skal du indlejre dine sensordata i et array i et enkelt dokument.
Jeg vil ikke foreslå at bruge GridFS her, jeg tror ikke, det er den bedste løsning, og her er hvorfor.
Der er en teknik kendt som bucketing, som du kan anvende, som i det væsentlige vil opdele dine sensoraflæsninger i separate dokumenter og løse dette problem for dig.
Måden det fungerer på er denne:
Lad os sige, at jeg har et dokument med nogle indlejrede aflæsninger for en bestemt sensor, der ser sådan ud:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
]
}
Med strukturen ovenfor er der allerede en stor fejl, aflæsningsarrayet kan vokse eksponentielt og overskride dokumentgrænsen på 16 MB.
Så det, vi kan gøre, er at ændre strukturen lidt, så den ser sådan ud, for at inkludere en tælleegenskab:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
],
count : 3
}
Ideen bag dette er, at når du $skubber din læsning ind i dit indlejrede array, øger du ($inc) tællevariablen for hvert tryk, der udføres. Og når du udfører denne opdateringsoperation (push), vil du inkludere et filter på denne "tælle"-egenskab, som kan se sådan ud:
{ count : { $lt : 500} }
Indstil derefter dine opdateringsindstillinger, så du kan indstille "upsert" til "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 }
)
se her for mere info om MongoDb Update og Upsert muligheden:
MongoDB opdateringsdokumentation
Det, der vil ske, er, når filterbetingelsen ikke er opfyldt (dvs. når der enten ikke er noget eksisterende dokument for denne sensor, eller tallet er større eller lig med 500 - fordi du øger det hver gang et element skubbes), en ny dokument vil blive oprettet, og aflæsningerne vil nu blive indlejret i dette nye dokument. Så du når aldrig grænsen på 16 MB, hvis du gør dette ordentligt.
Når du nu forespørger i databasen for aflæsninger af en bestemt sensor, kan du muligvis få flere dokumenter tilbage for den sensor (i stedet for kun ét med alle aflæsningerne i den), for eksempel, hvis du har 10.000 aflæsninger, vil du få 20 dokumenter tilbage , hver med 500 aflæsninger hver.
Du kan derefter bruge aggregeringspipeline og $unwind til at filtrere dine aflæsninger, som om de var deres egne individuelle dokumenter.
For mere information om slappe af se her, det er meget nyttigt
MongoDB Slap af
Jeg håber, at dette hjælper.