Aby rozwiązać ten problem, będziesz musiał dokonać drobnych poprawek w strukturze danych. Sądząc po tym, aby Twoje dokumenty przekroczyły limit 16 MB, musisz osadzić dane z czujnika w tablicy w jednym dokumencie.
Nie sugerowałbym używania GridFS tutaj, nie wierzę, że jest to najlepsze rozwiązanie, a oto dlaczego.
Istnieje technika znana jako wiadro, którą możesz zastosować, która zasadniczo podzieli odczyty czujnika na oddzielne dokumenty, rozwiązując ten problem za Ciebie.
Działa to tak:
Powiedzmy, że mam dokument z osadzonymi odczytami dla konkretnego czujnika, który wygląda tak:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
]
}
W powyższej strukturze istnieje już poważna wada, tablica odczytów może rosnąć wykładniczo i przekraczać limit dokumentów 16 MB.
Możemy więc nieco zmienić strukturę, aby wyglądała tak, aby uwzględnić właściwość count:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
],
count : 3
}
Ideą, która się za tym kryje, jest to, że kiedy $wpychasz swój odczyt do wbudowanej tablicy, zwiększasz ($inc) zmienną count dla każdego wykonanego wypchnięcia. A kiedy wykonujesz tę operację aktualizacji (wypychania), dołączysz filtr do tej właściwości „count”, który może wyglądać mniej więcej tak:
{ count : { $lt : 500} }
Następnie ustaw opcje aktualizacji, aby ustawić „upsert” na „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 }
)
zobacz tutaj, aby uzyskać więcej informacji na temat aktualizacji MongoDb i opcji Upsert:
Dokumentacja aktualizacji MongoDB
Co się stanie, gdy warunek filtrowania nie zostanie spełniony (tzn. albo nie ma istniejącego dokumentu dla tego czujnika, albo liczba jest większa lub równa 500 - ponieważ zwiększasz ją za każdym razem, gdy element jest wciskany), nowy dokument zostanie utworzony, a odczyty zostaną teraz osadzone w tym nowym dokumencie. Więc nigdy nie osiągniesz limitu 16 MB, jeśli zrobisz to poprawnie.
Teraz, gdy wysyłasz zapytanie do bazy danych o odczyty określonego czujnika, możesz odzyskać wiele dokumentów dla tego czujnika (zamiast tylko jednego ze wszystkimi odczytami), na przykład, jeśli masz 10 000 odczytów, otrzymasz z powrotem 20 dokumentów , każdy z 500 odczytami.
Następnie możesz użyć potoku agregacji i $unwind, aby filtrować odczyty tak, jakby były własnymi dokumentami.
Aby uzyskać więcej informacji o odprężeniu, zobacz tutaj, jest to bardzo przydatne
MongoDB odpręż się
Mam nadzieję, że to pomoże.