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 = truesubscribe_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