mongo_orm Eccezione: chiave bson mancante: publish_acl (eccezione)

Quando estendi le tue definizioni di campo nelle classi di documenti mongo_orm, in particolare con documenti incorporati, potresti incorrere nel seguente errore di runtime (!):

Eccezione: chiave bson mancante: (Eccezione)

Questo non è un errore nel tuo codice - il tuo codice si sta alzando, perché la struttura del database non è come si aspetta che sia!

Ecco il codice di esempio che sto usando per creare un DB Mongo Auth & ACL per VerneMQ:

classe PublishACL < Mongo::ORM::EmbeddedDocument
     modello di campo : Stringa
     campo max_qos : Int32
     campo allowed_retain : Bool
     campo max_payload_size : Int32
fine

classe SubscribeACL < Mongo::ORM::EmbeddedDocument
     modello di campo : Stringa
     campo max_qos : Int32
fine

classe MQTTCredentials < Mongo::ORM::Document
     nome_raccolta "vmq_acl_auth"
     campo mountpoint : Stringa
     campo client_id : Stringa
     campo nome utente : Stringa
     campo passhash : Stringa
     embeds_many :publish_acl, class_name: Papi::PublishACL 
     embeds_many :subscribe_acl, class_name: Papi::SubscribeACL

Le chiavi # sono uniche per apikey_prefix
def self.getcredentials(apikey_prefix : String, bcm_serial : String)
     successo = falso
     1TP3Se le credenziali non esistono ancora, vengono aggiunte
     creds = self.first({"client_id" => bcm_serial, "username" => apikey_prefix})
     se !creds
         creds = self.new()
     fine

     (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 
     successo = creds.save

(snip)

fine

fine

Le ACL sono state inserite dopo che avevo già voci di database senza di esse:

immagine

Messaggio di errore MongoORM:

Eccezione: chiave bson mancante: publish_acl (eccezione)
   da src/db.cr:0:4 in 'from_bson'
   da lib/mongo_orm/src/mongo_orm/querying.cr:93:7 in 'all'
   da lib/mongo_orm/src/mongo_orm/querying.cr:90:3 in 'all'

  (snip)

  da /usr/share/crystal/src/fiber.cr:47:34 in '->'
   da un'ora e mezza, da un'ora e mezza.

MongoORM non trova i campi previsti publish_acl e subscribe_acl, che sono stati aggiunti successivamente.

Soluzione: abbandonate (o aggiornate) i documenti della collezione che non sono conformi al vostro nuovo standard.

Questo è, per esempio, come appare una voce del database per quanto sopra:

immagine

Bonus

in lib/mongo_orm/src/mongo_orm/extended_bson.cr:40: nessun sovraccarico corrisponde a 'BSON#[]=' con tipi String, Array(Papi::PublishACL)

I sovraccarichi sono:

- BSON#[]=(chiave, valore : Int32)

- BSON#[]=(chiave, valore : Int64)

- BSON#[]=(chiave, valore : Binario)

- BSON#[]=(chiave, valore : Bool)

- BSON#[]=(key, value : Float64 | Float32)

- BSON#[]=(chiave, valore : MinKey)

- BSON#[]=(chiave, valore : MaxKey)

- BSON#[]=(chiave, valore : Nil)

- BSON#[]=(chiave, valore : ObjectId)

- BSON#[]=(chiave, valore : String)

- BSON#[]=(chiave, valore : Simbolo)

- BSON#[]=(chiave, valore : Tempo)

- BSON#[]=(chiave, valore : Timestamp)

- BSON#[]=(chiave, valore : Codice)

- BSON#[]=(chiave, valore : BSON)

- BSON#[]=(chiave, valore : Regex)

- BSON#[]=(key, value : Mongo::ORM::EmbeddedDocument)

bson[_chiave] = valore

Tu non può fare questo (attualmente) con MongoORM:

creds.publish_acl = [ publish_acl ]

invece dovete usare:

creds.publish_acl << publish_acl