mongo_orm Exception: fehlender bson-Schlüssel: publish_acl (Exception)
Wenn Sie Ihre Felddefinitionen in den mongo_orm-Dokumentenklassen erweitern, insbesondere mit eingebetteten Dokumenten, können Sie auf den folgenden Laufzeitfehler (!) stoßen:
Ausnahme: fehlender bson-Schlüssel: (Ausnahme)
Es handelt sich nicht um einen Fehler in Ihrem Code - Ihr Code geht auf, weil die Datenbankstruktur nicht so ist, wie er sie erwartet!
Hier ist der Beispielcode, den ich für die Erstellung einer Mongo Auth & ACL DB für VerneMQ verwende:
Klasse PublishACL < Mongo::ORM::EmbeddedDocument
Feldmuster : String
Feld max_qos : Int32
field allowed_retain : Bool
Feld max_payload_size : Int32
EndeKlasse SubscribeACL < Mongo::ORM::EmbeddedDocument
Feldmuster : String
Feld max_qos : Int32
EndeKlasse MQTTCredentials < Mongo::ORM::Document
sammlung_name "vmq_acl_auth"
Feld Einhängepunkt : String
Feld client_id : String
feld benutzername : String
Feld passhash : String
embeds_many :publish_acl, class_name: Papi::PublishACL
embeds_many :subscribe_acl, class_name: Papi::SubscribeACL
#-Schlüssel sind per apikey_prefix eindeutig
def self.getcredentials(apikey_prefix : String, bcm_serial : String)
Erfolg = false
1TP3Wenn die Berechtigungsnachweise noch nicht vorhanden sind, werden sie hinzugefügt
creds = self.first({"client_id" => bcm_serial, "username" => apikey_prefix})
if !creds
creds = self.new()
Ende(Schnipsel)
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
Erfolg = creds.save(Schnipsel)
Ende
Ende
Die ACLs wurden eingefügt, nachdem ich bereits Datenbankeinträge ohne sie hatte:
MongoORM-Fehlermeldung:
Ausnahme: fehlender bson-Schlüssel: publish_acl (Ausnahme)
from src/db.cr:0:4 in 'from_bson'
von lib/mongo_orm/src/mongo_orm/querying.cr:93:7 in 'all'
von lib/mongo_orm/src/mongo_orm/querying.cr:90:3 in 'all'(Schnipsel)
von /usr/share/crystal/src/fiber.cr:47:34 in '->'
aus dem Jahr 2000.
MongoORM findet die erwarteten Felder publish_acl und subscribe_acl nicht, die später hinzugefügt wurden.
Lösung: Löschen (oder aktualisieren) Sie die Dokumente in der Sammlung, die nicht Ihrem neuen Standard entsprechen.
So sieht zum Beispiel ein Datenbankeintrag für die oben genannten Themen aus:
Bonus
in lib/mongo_orm/src/mongo_orm/extended_bson.cr:40: keine Überladung entspricht 'BSON#[]=' mit den Typen String, Array(Papi::PublishACL)
Überlastungen sind:
- BSON#[]=(Schlüssel, Wert : Int32)
- BSON#[]=(Schlüssel, Wert : Int64)
- BSON#[]=(Schlüssel, Wert : Binär)
- BSON#[]=(Schlüssel, Wert : Bool)
- BSON#[]=(Schlüssel, Wert : Float64 | Float32)
- BSON#[]=(Schlüssel, Wert : MinKey)
- BSON#[]=(Schlüssel, Wert : MaxKey)
- BSON#[]=(Schlüssel, Wert : Nil)
- BSON#[]=(Schlüssel, Wert : ObjectId)
- BSON#[]=(Schlüssel, Wert : String)
- BSON#[]=(Schlüssel, Wert : Symbol)
- BSON#[]=(Schlüssel, Wert : Zeit)
- BSON#[]=(Schlüssel, Wert : Zeitstempel)
- BSON#[]=(Schlüssel, Wert : Code)
- BSON#[]=(Schlüssel, Wert : BSON)
- BSON#[]=(Schlüssel, Wert : Regex)
- BSON#[]=(Schlüssel, Wert : Mongo::ORM::EmbeddedDocument)
bson[_key] = Wert
Sie kann nicht tun dies (derzeit) mit MongoORM:
creds.publish_acl = [ publish_acl ]
stattdessen müssen Sie verwenden:
creds.publish_acl << publish_acl