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
fineclasse SubscribeACL < Mongo::ORM::EmbeddedDocument
modello di campo : Stringa
campo max_qos : Int32
fineclasse 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 = truesubscribe_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:
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:
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