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
eindeklasse SubscribeACL < Mongo::ORM::EmbeddedDocument
veld patroon : String
veld max_qos : Int32
eindeklasse 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 = truesubscribe_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:
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:
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