Untuk memperbaiki masalah ini, Anda perlu membuat beberapa perubahan kecil pada struktur data Anda. Tampaknya, agar dokumen Anda melebihi batas 16mb, Anda harus menyematkan data sensor Anda ke dalam larik dalam satu dokumen.
Saya tidak menyarankan menggunakan GridFS di sini, saya tidak percaya itu sebagai solusi terbaik, dan inilah alasannya.
Ada teknik yang dikenal sebagai bucketing yang dapat Anda terapkan yang pada dasarnya akan membagi pembacaan sensor Anda menjadi dokumen terpisah, memecahkan masalah ini untuk Anda.
Cara kerjanya begini:
Katakanlah saya memiliki dokumen dengan beberapa bacaan tertanam untuk sensor tertentu yang terlihat seperti ini:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
]
}
Dengan struktur di atas, sudah ada kelemahan besar, array pembacaan bisa tumbuh secara eksponensial, dan melebihi batas dokumen 16mb.
Jadi yang bisa kita lakukan adalah mengubah sedikit struktur agar terlihat seperti ini, untuk menyertakan properti count:
{
_id : ObjectId("xxx"),
sensor : "SensorName1",
readings : [
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" },
{ date : ISODate("..."), reading : "xxx" }
],
count : 3
}
Ide di balik ini adalah, ketika Anda $push bacaan Anda ke dalam array yang disematkan, Anda menambahkan ($inc) variabel count untuk setiap push yang dilakukan. Dan ketika Anda melakukan operasi pembaruan (push) ini, Anda akan menyertakan filter pada properti "hitungan" ini, yang mungkin terlihat seperti ini:
{ count : { $lt : 500} }
Kemudian, atur Opsi Pembaruan Anda sehingga Anda dapat mengatur "upsert" menjadi "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 }
)
lihat di sini untuk info lebih lanjut tentang Pembaruan MongoDb dan opsi Upsert:
Dokumentasi pembaruan MongoDB
Apa yang akan terjadi adalah, ketika kondisi filter tidak terpenuhi (yaitu ketika tidak ada dokumen yang ada untuk sensor ini, atau hitungannya lebih besar atau sama dengan 500 - karena Anda menambahkannya setiap kali item didorong), yang baru dokumen akan dibuat, dan bacaan sekarang akan disematkan dalam dokumen baru ini. Jadi Anda tidak akan pernah mencapai batas 16mb jika Anda melakukannya dengan benar.
Sekarang, saat menanyakan database untuk pembacaan sensor tertentu, Anda mungkin mendapatkan kembali beberapa dokumen untuk sensor itu (bukan hanya satu dengan semua pembacaan di dalamnya), misalnya, jika Anda memiliki 10.000 pembacaan, Anda akan mendapatkan 20 dokumen kembali , masing-masing dengan 500 bacaan.
Anda kemudian dapat menggunakan saluran agregasi dan $unwind untuk memfilter bacaan Anda seolah-olah itu adalah dokumen individual mereka sendiri.
Untuk informasi lebih lanjut tentang bersantai lihat di sini, ini sangat berguna
MongoDB Bersantai
Saya harap ini membantu.