mongo_orm Uitzondering: ontbrekende bson sleutel: publish_acl (Uitzondering)

Wanneer u uw velddefinities uitbreidt in de mongo_orm documentklassen, specifiek met ingesloten documenten, kunt u de volgende runtime (!) fout tegenkomen:

Uitzondering: ontbrekende bson sleutel: (Uitzondering)

Dit is geen fout in uw code - uw code loopt op, omdat de databasestructuur niet is zoals hij verwacht dat die zal zijn!

Hier is het voorbeeld code die ik gebruik voor het maken van een Mongo Auth & ACL DB voor VerneMQ:

klasse PublishACL < Mongo::ORM::EmbeddedDocument
     veld patroon : String
     veld max_qos : Int32
     veld allowed_retain : Bool
     veld max_payload_size : Int32
einde

klasse SubscribeACL < Mongo::ORM::EmbeddedDocument
     veld patroon : String
     veld max_qos : Int32
einde

klasse MQTTCredentials < Mongo::ORM::Document
     collection_name "vmq_acl_auth"
     veld mountpoint : String
     veld client_id : String
     veld gebruikersnaam : String
     veld passhash : String
     embeds_many :publish_acl, class_name: Papi::PublishACL 
     embeds_many :subscribe_acl, class_name: Papi::SubscribeACL

# sleutels zijn uniek per apikey_prefix
def self.getcredentials(apikey_prefix : String, bcm_serial : String)
     succes = vals
     1TP3Als de referenties nog niet bestaan, worden ze toegevoegd
     creds = self.first({"client_id" => bcm_serial, "gebruikersnaam" => apikey_prefix})
     als !creds
         creds = self.new()
     einde

     (snip)

    publish_acl = PublishACL.new()
     subscribe_acl = SubscribeACL.new()
     # https://vernemq.com/docs/configuration/db-auth.html
     publish_acl.pattern = "#"
     publish_acl.max_qos = 2 # Int
     publish_acl.allowed_retain = true

    subscribe_acl.pattern = "#"
     subscribe_acl.max_qos = 2
    
     creds.publish_acl << publish_acl
     creds.subscribe_acl << subscribe_acl 
     succes = creds.save

(snip)

einde

einde

De ACL's werden ingevoegd nadat ik al database vermeldingen had zonder hen:

afbeelding

MongoORM foutmelding:

Uitzondering: ontbrekende bson-sleutel: publish_acl (Uitzondering)
   uit src/db.cr:0:4 in "from_bson
   uit lib/mongo_orm/src/mongo_orm/querying.cr:93:7 in 'all'
   uit lib/mongo_orm/src/mongo_orm/querying.cr:90:3 in 'all'

  (snip)

  uit /usr/share/crystal/src/fiber.cr:47:34 in '->'
   van de politie.

MongoORM vindt niet de verwachte velden publish_acl en subscribe_acl, die later werden toegevoegd.

Oplossing: laat de documenten in de verzameling die niet aan uw nieuwe norm voldoen, vallen (of verbeter ze).

Zo ziet bijvoorbeeld een databankgegeven er voor het bovenstaande uit:

afbeelding

Bonus

in lib/mongo_orm/src/mongo_orm/extended_bson.cr:40: geen overload komt overeen met 'BSON#[]=' met types String, Array(Papi::PublishACL)

Overbelastingen zijn:

- BSON#[]=(sleutel, waarde : Int32)

- BSON#[]=(sleutel, waarde : Int64)

- BSON#[]=(sleutel, waarde : Binair)

- BSON#[]=(sleutel, waarde : Bool)

- BSON#[]=(sleutel, waarde : Float64 | Float32)

- BSON#[]=(sleutel, waarde : MinKey)

- BSON#[]=(sleutel, waarde : MaxKey)

- BSON#[]=(sleutel, waarde : Nihil)

- BSON#[]=(sleutel, waarde : ObjectId)

- BSON#[]=(sleutel, waarde : String)

- BSON#[]=(sleutel, waarde : Symbool)

- BSON#[]=(sleutel, waarde : Tijd)

- BSON#[]=(sleutel, waarde : Tijdstempel)

- BSON#[]=(sleutel, waarde : Code)

- BSON#[]=(sleutel, waarde : BSON)

- BSON#[]=(sleutel, waarde : Regex)

- BSON#[]=(sleutel, waarde : Mongo::ORM::EmbeddedDocument)

bson[_key] = waarde

Jij kan niet doe dit (momenteel) met MongoORM:

creds.publish_acl = [ publish_acl ]

in plaats daarvan moet je gebruiken:

creds.publish_acl << publish_acl