MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Заобиколно решение на MongoDB за документ с размер над 16 MB?

За да разрешите този проблем, ще трябва да направите някои малки изменения в структурата на данните си. По думите му, за да могат вашите документи да надхвърлят ограничението от 16 MB, трябва да вграждате данните от сензора си в масив в един документ.

Не бих предложил да използвате GridFS тук, не вярвам, че е най-доброто решение и ето защо.

Има техника, известна като bucketing, която можете да използвате, която по същество ще раздели показанията на сензора ви на отделни документи, решавайки този проблем вместо вас.

Начинът, по който работи е следният:

Да кажем, че имам документ с някои вградени показания за конкретен сензор, който изглежда така:

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

С горната структура вече има сериозен недостатък, масивът от показания може да нарасне експоненциално и да надхвърли ограничението за документи от 16 MB.

Така че това, което можем да направим, е леко да променим структурата, за да изглежда така, за да включим свойство count:

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

Идеята зад това е, когато $натиснете вашето четене във вашия вграден масив, вие увеличавате ($inc) променливата count за всяко натискане, което се извършва. И когато изпълнявате тази операция за актуализиране (натискане), ще включите филтър за това свойство "count", което може да изглежда така:

{ count : { $lt : 500} }

След това задайте вашите опции за актуализиране, така че да можете да зададете "upsert" на "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 }
)

вижте тук за повече информация относно MongoDb Update и опцията Upsert:

Документация за актуализиране на MongoDB

Това, което ще се случи е, когато условието за филтриране не е изпълнено (т.е. когато няма съществуващ документ за този сензор, или броят е по-голям или равен на 500 - защото го увеличавате всеки път, когато елемент е натиснат), нов документът ще бъде създаден и показанията ще бъдат вградени в този нов документ. Така че никога няма да достигнете ограничението от 16 MB, ако направите това правилно.

Сега, когато отправяте заявка към базата данни за показания на конкретен сензор, можете да получите обратно няколко документа за този сензор (вместо само един с всички показания в него), например, ако имате 10 000 показания, ще получите обратно 20 документа , всеки с по 500 показания.

След това можете да използвате конвейера за агрегиране и $unwind, за да филтрирате показанията си, сякаш са техни индивидуални документи.

За повече информация относно отпускането вижте тук, много е полезно

MongoDB Unwind

Надявам се това да помогне.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Добавете нов валидатор към съществуващата колекция

  2. Mongoid:намерете чрез масив от идентификатори

  3. Java, MongoDB:Как да актуализирате всеки обект, докато повтаряте огромна колекция?

  4. Как да изключите едно конкретно поле от колекция в Mongoose?

  5. ScaleGrid обявява споделен хостинг на MongoDB на Amazon AWS