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
Ende

Klasse SubscribeACL < Mongo::ORM::EmbeddedDocument
     Feldmuster : String
     Feld max_qos : Int32
Ende

Klasse 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 = true

    subscribe_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:

Bild

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:

Bild

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