MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Obejście MongoDB dla dokumentu o rozmiarze większym niż 16 MB?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak usunąć jeden „dokument” według „identyfikatora” za pomocą oficjalnego sterownika C# dla MongoDB?

  2. Instalowanie i uruchamianie MongoDB na OSX

  3. Jak zbudować skracacz adresów URL za pomocą Node.js i MongoDB

  4. Analiza porównawcza MongoDB — zwiększanie wydajności NoSQL

  5. MongoDB rozwija wiele tablic