sql >> Database teknologi >  >> NoSQL >> MongoDB

Modellering af undersamlinger i MongoDB Realm Sync

Din kode ser fantastisk ud, og du er på vej i den rigtige retning, så dette svar er mere forklaring og forslag til modellering end hård kode.

For det første er Realm-objekter dovent indlæst hvilket betyder, at de kun er læsset, når de bruges. Titusindvis af objekter vil have meget lille indvirkning på enhedens hukommelse. Så antag, at du har 10.000 brugere, og du 'indlæser dem alle sammen'

let myTenThousandUsers = realm.objects(UserClass.self)
 

meh, ingen big deal. Men gør dette

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

vil (kunne) skabe et problem - hvis det returnerer 10.000 brugere er de alle indlæst i hukommelsen muligvis overvældende enheden. Det er en Swift-funktion, og "konvertering" af Realms-dovne data ved hjælp af Swift bør generelt undgås (afhængig af tilfælde)

Observationen af ​​denne kode ved hjælp af Swift .forEach

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

kan forårsage problemer afhængigt af, hvad der bliver gjort med disse projektobjekter - at bruge dem som en tableView-datakilde kan give problemer, hvis der er mange af dem.

Den anden ting er spørgsmålet om grænsen på 16 Mb pr. dokument. For klarhedens skyld er et Atlas-dokument dette

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

hvor værdien kan være enhver af BSON-datatyperne, såsom andre dokumenter, arrays og arrays af dokumenter.

I din struktur er var tasks = RealmSwift.List<Task>() hvor Task er et indlejret objekt . Mens konceptuelt indlejrede objekter er objekter, tror jeg, de tæller med i en enkelt dokumentgrænse, fordi de er indlejret (ret mig, hvis jeg tager fejl); efterhånden som antallet af dem vokser, vokser størrelsen af ​​det vedlagte dokument - husk på, at 16 Mb tekst er ENORMT tekst, så det ville/kunne svare til millioner af opgaver pr. projekt.

Den enkle løsning er ikke at integrere dem og få dem til at stå alene.

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

Så kan hver enkelt være 16Mb, og et 'ubegrænset antal' kan knyttes til et enkelt projekt. En fordel ved indlejrede objekter er en type kaskadesletning, hvor når det overordnede objekt slettes, er de underordnede objekter det også, men med en 1-mange relation fra projekt til opgaver - det er nemt at slette en masse opgaver, der tilhører en forælder.

Åh - en anden sag for ikke at bruge indlejrede objekter - især for denne brug - er, at de ikke kan have indekserede egenskaber. Indeksering kan i høj grad fremskynde nogle forespørgsler.




  1. MongoDB $graphLookup får børn alle niveauer dybt - indlejret resultat

  2. Har mongoDB problemer med genforbindelse, eller gør jeg det forkert?

  3. Forår Custom Query med sidebar

  4. Hvordan kan jeg importere data til Mongodb fra Json-fil ved hjælp af java