mongodb 或查询匹配nil或“”与Mongoid仍匹配“"?

tvmytwxo  于 2023-01-12  发布在  Go
关注(0)|答案(3)|浏览(181)

我正在尝试为一个嵌入式Mongoid::Document编写一个查询,该查询查找“address”字段既不是nil也不是“"的任何记录。
通过结合使用MongoDB文档this issue in the Mongoid bug reports和Mongoid文档,我认为应该可以实现以下功能:

scope :with_address, where("$or" => [{:address => {"$ne" => nil}}, {:address => {"$ne" => ""}}])

当我运行这个命令时,选择器看起来不错:

1.9.2p290 :002 > report.document.records.with_address
 => #<Mongoid::Criteria
  selector: {"$or"=>[{:address=>{"$ne"=>nil}}, {:address=>{"$ne"=>""}}]},  
  options:  {},
  class:    GlobalBoarding::MerchantPrincipal,
  embedded: true>

但当我查看结果时,它们包含一个地址为空的条目:

1.9.2p290 :007 > report.document.records.with_address.last  
<Record _id: 4f593f245af0501074000122, _type: nil,  version: 1, name: "principal contact 3", title: "", dob: nil, address: "", email: "", phone: "", fax: "">

我不知道我是否做错了一个查询,这是Mongoid的一个bug,还是有其他的问题。有人有这样的查询经验吗?

cuxqih21

cuxqih211#

最后,这是我能找到的唯一方法,可以选择某个字段不为nil也不为空的记录:

scope :with_name, all_of(:name.ne => nil).all_of(:name.ne => "")
kuhbmx9i

kuhbmx9i2#

我觉得你会笑的。
nil和“”都不等于说:不是零也不是“"。
你真正的意思是and,它可以不用$and来表达,只需要:

$ne=>nil, $ne=>""
slwdgvem

slwdgvem3#

你可以做得更简洁些:

scope :with_name, where(:name.nin => ["", nil])

参见MongoDB manual

相关问题