MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB giải pháp cho tài liệu có kích thước trên 16mb?

Để khắc phục sự cố này, bạn sẽ cần thực hiện một số sửa đổi nhỏ đối với cấu trúc dữ liệu của mình. Nghe có vẻ, để tài liệu của bạn vượt quá giới hạn 16mb, bạn phải nhúng dữ liệu cảm biến của mình vào một mảng trong một tài liệu.

Tôi không đề xuất sử dụng GridFS ở đây, tôi không tin rằng nó là giải pháp tốt nhất và đây là lý do tại sao.

Có một kỹ thuật được gọi là bucketing mà bạn có thể sử dụng, về cơ bản sẽ chia các kết quả đọc trên cảm biến của bạn thành các tài liệu riêng biệt, giải quyết vấn đề này cho bạn.

Cách nó hoạt động là thế này:

Giả sử tôi có một tài liệu với một số bài đọc được nhúng cho một cảm biến cụ thể trông giống như sau:

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

Với cấu trúc trên, đã có một lỗ hổng lớn, mảng số liệu đọc có thể phát triển theo cấp số nhân và vượt quá giới hạn tài liệu 16mb.

Vì vậy, những gì chúng ta có thể làm là thay đổi cấu trúc một chút để trông giống như thế này, để bao gồm một thuộc tính count:

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

Ý tưởng đằng sau điều này là, khi bạn $ đẩy số đọc của mình vào mảng được nhúng, bạn tăng ($ inc) biến đếm cho mỗi lần đẩy được thực hiện. Và khi bạn thực hiện thao tác cập nhật (đẩy) này, bạn sẽ bao gồm một bộ lọc trên thuộc tính "count" này, có thể trông giống như sau:

{ count : { $lt : 500} }

Sau đó, đặt Tùy chọn cập nhật của bạn để bạn có thể đặt "upert" thành "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 }
)

xem tại đây để biết thêm thông tin về Cập nhật MongoDb và tùy chọn Nâng cấp:

Tài liệu cập nhật MongoDB

Điều gì sẽ xảy ra là, khi điều kiện bộ lọc không được đáp ứng (tức là khi không có tài liệu hiện có cho cảm biến này hoặc số lượng lớn hơn hoặc bằng 500 - bởi vì bạn đang tăng nó lên mỗi khi một mục được đẩy), tài liệu sẽ được tạo và các bài đọc bây giờ sẽ được nhúng vào tài liệu mới này. Vì vậy, bạn sẽ không bao giờ đạt đến giới hạn 16mb nếu bạn làm điều này đúng cách.

Bây giờ, khi truy vấn cơ sở dữ liệu để tìm các bài đọc của một cảm biến cụ thể, bạn có thể lấy lại nhiều tài liệu cho cảm biến đó (thay vì chỉ một tài liệu với tất cả các bài đọc trong đó), ví dụ:nếu bạn có 10.000 lần đọc, bạn sẽ nhận lại 20 tài liệu , mỗi bài có 500 lượt đọc.

Sau đó, bạn có thể sử dụng đường ống tổng hợp và $ unwind để lọc các bài đọc của mình như thể chúng là tài liệu riêng lẻ của chúng.

Để biết thêm thông tin về thư giãn, hãy xem tại đây, nó rất hữu ích

Thư giãn trong MongoDB

Tôi hy vọng điều này sẽ hữu ích.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Khắc phục “kinh độ / vĩ độ nằm ngoài giới hạn” trong MongoDB khi tạo Chỉ mục 2dsphere

  2. Cập nhật các mảng lồng nhau trong mongodb

  3. Tác động đến hiệu suất Meltdown đối với MongoDB:AWS, Azure &DigitalOcean

  4. Có bất kỳ lý do nào khiến tôi nên / không nên sử dụng ObjectId trong url RESTful của mình không

  5. Chuyển đổi dự phòng cho MySQL Replication (và những thứ khác) - Nó có nên được Tự động hóa không?