mongo_orm 异常:缺少bson键:publish_acl(异常)。

当你在mongo_orm文档类中扩展你的字段定义时,特别是用嵌入式文档,你可能会遇到以下运行时(!)错误。

异常:缺少bson键。(异常)。

这不是你的代码中的错误--你的代码在提高,因为数据库结构与它所期望的不一样!这不是一个错误。

下面是我用来为VerneMQ创建Mongo Auth & ACL DB的示例代码。

class PublishACL < Mongo::ORM::EmbeddedDocument
     字段模式:字符串
     字段 max_qos : Int32
     field allowed_retain : Bool
     字段 max_payload_size : Int32
结束

class SubscribeACL < Mongo::ORM::EmbeddedDocument
     字段模式:字符串
     字段 max_qos : Int32
结束

class MQTTCredentials < Mongo::ORM::Document
     collection_name "vmq_acl_auth"
     字段mountpoint : String
     field client_id : String
     字段username : 字符串
     字段passhash:字符串
     embeds_many :publish_acl, class_name: Papi::PublishACL 
     embeds_many :subscribe_acl, class_name: Papi::SubscribeACL

#的密钥在每个apikey_prefix中是唯一的。
def self.getcredentials(apikey_prefix : String, bcm_serial : String)
     success = false
     1TP3如果凭证还不存在,就会被添加进去。
     creds = self.first({"client_id" => bcm_serial, "username" => apikey_prefix})
     如果 !"creds
         信誉 = self.new()
     结束

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

(snip)

结束

结束

ACL是在我已经有了没有ACL的数据库条目之后插入的。

形象

MongoORM错误信息。

异常:缺少bson键:publish_acl(异常)。
   from src/db.cr:0:4 in 'from_bson'.
   从lib/mongo_orm/src/mongo_orm/querying.cr:93:7在'all'中。
   从lib/mongo_orm/src/mongo_orm/querying.cr:90:3在'all'中。

  (snip)

  从/usr/share/crystal/src/fiber.cr:47:34中的'->'。
   从???

MongoORM没有找到预期的字段publish_acl和subscribe_acl,这些字段是后来添加的。

解决办法:放弃(或升级)收集的文件,这些文件不符合你的新标准。

例如,上面的数据库条目是这样的。

形象

奖金

in lib/mongo_orm/src/mongo_orm/extended_bson.cr:40: no overload matches 'BSON#[]=' with types String, Array(Papi::PublishACL)

过载是指。

- BSON#[]=(key, value : Int32)

- BSON#[]=(key, value : Int64)

- BSON#[]=(key, value : 二进制)

- BSON#[]=(key, value : Bool)

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

- BSON#[]=(key, value : MinKey)

- BSON#[]=(key, value : MaxKey)

- BSON#[]=(key, value : Nil)

- BSON#[]=(key, value : ObjectId)

- BSON#[]=(key, value : String)

- BSON#[]=(key, value : Symbol)

- BSON#[]=(key, value : Time)

- BSON#[]=(key, value : Timestamp)

- BSON#[]=(key, value : Code)

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

- BSON#[]=(key, value : Regex)

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

bson[_key] = value

不能 目前)用MongoORM做这个。

creds.publish_acl = [ publish_acl ]

相反,你必须使用。

creds.publish_acl << publish_acl