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

Моделиране на подколекции в MongoDB Realm Sync

Вашият код изглежда страхотно и се движите в правилната посока, така че този отговор е повече обяснение и предложения за моделиране, отколкото твърд код.

Първо, обектите на Realm са мързеливи заредено което означава, че се зареждат само когато се използват. Десетки хиляди обекти ще имат много малко въздействие върху паметта на устройството. Да предположим, че имате 10 000 потребители и ги „зареждате всички“

let myTenThousandUsers = realm.objects(UserClass.self)

мх, нищо страшно. Правейки това обаче

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

ще (може) да създаде проблем - ако това върне 10 000 потребители те всички са заредени в паметта вероятно претоварване на устройството. Това е функция на Swift и „преобразуването“ на мързеливи данни на Realms с помощта на Swift обикновено трябва да се избягва (в зависимост от случая)

Наблюдението на този код с помощта на Swift .forEach

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

може да причини проблеми в зависимост от това какво се прави с тези проектни обекти - използването им като tableView dataSource може да е проблем, ако има много от тях.

Второто нещо е въпросът за ограничението от 16Mb на документ. За по-голяма яснота това е документ на Атлас

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

където стойността може да бъде всеки от типовете данни BSON, като други документи, масиви и масиви от документи.

Във вашата структура var tasks = RealmSwift.List<Task>() където Task е вграден обект . Въпреки че концептуално вградените обекти са обекти, аз вярвам, че те се броят към ограничението за един документ, защото са вградени (поправете ме, ако греша); тъй като броят им расте, размерът на придружаващия документ нараства - имайки предвид, че 16Mb текст е ОГРОМНО МНОГО текст, така че би/може да се равнява на милиони задачи на проект.

Простото решение е да не ги вграждате и да ги оставите да стоят сами.

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"
    }
}

Тогава всеки може да бъде 16Mb и „неограничен брой“ може да бъде свързан с един проект. Едно предимство на вградените обекти е вид каскадно изтриване, при което, когато родителският обект се изтрие, дъщерните обекти също се изтриват, но с връзка 1-много от Project към Tasks - изтриването на куп задачи, принадлежащи на родител, е лесно.

О - друг случай за неизползване на вградени обекти - особено за този случай на употреба - е, че те не могат да имат индексирани свойства. Индексиране може значително да ускори някои заявки.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Какъв е правилният модел за вложени схеми в Mongoose/MongoDB?

  2. Проблем с безопасно_формат_монтиране на Google Compute Engine – посочете грешка във типа на файловата система

  3. Как да подобря производителността на update() и save() в MongoDB?

  4. Общи стойности от всички ключове в поддокумента

  5. Moongoose 3.8.8 поддържа ли $position оператор?