MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Membuat model sub-koleksi di MongoDB Realm Sync

Kode Anda terlihat bagus dan Anda menuju ke arah yang benar, jadi jawaban ini lebih merupakan penjelasan dan saran tentang pemodelan daripada kode keras.

Pertama, objek Realm adalah dengan malas dimuat yang berarti mereka hanya dimuat saat digunakan. Puluhan ribu objek akan berdampak sangat kecil pada memori perangkat. Jadi misalkan Anda memiliki 10.000 pengguna dan Anda 'memuat semuanya'

let myTenThousandUsers = realm.objects(UserClass.self)

meh, bukan masalah besar. Namun, melakukan ini

let someFilteredUsers = myTenThousandUsers.filter { $0.blah == "blah" }

akan (bisa) membuat masalah - jika itu mengembalikan 10.000 pengguna mereka semua dimuat ke dalam memori mungkin membebani perangkat. Itu adalah fungsi Swift dan 'mengonversi' data malas Realms menggunakan Swift umumnya harus dihindari (tergantung penggunaan kasus)

Pengamatan kode ini menggunakan Swift .forEach

realm.objects(Project.self).forEach { (project) in
   // Access fields     
}

dapat menyebabkan masalah tergantung pada apa yang sedang dilakukan dengan objek proyek tersebut - menggunakannya sebagai tableView dataSource bisa menjadi masalah jika jumlahnya banyak.

Hal kedua adalah pertanyaan tentang batas 16Mb per dokumen. Untuk kejelasan dokumen Atlas adalah ini

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}

di mana nilai dapat berupa salah satu tipe data BSON seperti dokumen lain, larik, dan larik dokumen.

Dalam struktur Anda, var tasks = RealmSwift.List<Task>() di mana Tugas adalah objek tersemat . Sementara objek yang disematkan secara konseptual adalah objek, saya yakin mereka diperhitungkan dalam batas dokumen tunggal karena mereka disematkan (koreksi saya jika saya salah); seiring bertambahnya jumlah mereka, ukuran dokumen terlampir bertambah - perlu diingat bahwa 16Mb teks adalah teks BESAR sehingga akan/bisa setara dengan jutaan tugas per proyek.

Solusi sederhananya adalah dengan tidak menyematkannya dan membuatnya berdiri sendiri.

class Task: Object {
    @objc dynamic var _id: String = ObjectId.generate().stringValue
    @objc dynamic var _partition: String = "" 
    @objc dynamic var name: String = ""
    @objc dynamic var status: String = "Pending"
    override static func primaryKey() -> String? {
        return "_id"
    }
}

Kemudian masing-masing dapat 16Mb, dan 'jumlah tak terbatas' dapat dikaitkan dengan satu proyek. Salah satu keuntungan dari objek yang disematkan adalah jenis penghapusan kaskade di mana ketika objek induk dihapus, objek anak juga, tetapi dengan hubungan 1-banyak dari Proyek ke Tugas - menghapus banyak tugas milik induk itu mudah.

Oh - kasus lain untuk tidak menggunakan objek yang disematkan - terutama untuk kasus penggunaan ini - adalah mereka tidak dapat memiliki properti yang diindeks. Pengindeksan dapat mempercepat beberapa kueri.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Delegasi metaclass tidak menjadi instance

  2. Penjelasan yang lebih baik tentang contoh spesifikasi bson?

  3. ServerSelectionTimeoutError saat menghubungkan ke aws dengan pymongo

  4. Tidak dapat memulai logstash menggunakan konfigurasi mongoDB?

  5. Proyeksi pada Kueri MongoDb menggunakan data Spring dan QueryDSL