2012-03-09 108 views
2

我想爲嵌入式Mongoid :: Document編寫一個查詢,查找其中「地址」字段既不是零也不是「」的任何記錄。或與查詢匹配零或「」與Mongoid仍匹配「」?

使用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的錯誤,或者是否有其他問題。有沒有人有這樣的查詢經驗?

+4

不應該查詢使用'$和'而不是'$或'? – Dieseltime 2012-03-09 22:52:32

+0

不,那永遠不會匹配?如果該值爲零,則它將不匹配「」,反之亦然。 – kclair 2012-03-09 22:56:58

+1

我同意,你或沒有意義。它是布爾邏輯,a!= 1或!= 2將始終返回true,因爲它總是不會是1或不是2. – 2012-03-09 23:04:10

回答

4
到底

,這是我能找到的唯一途徑,致力於選擇的記錄,其中某一個領域是不是零和非空白:

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

我想你會在這個笑聲。

「nil」和「」與不一樣,也不是「」。

你真正的意思and,並且在不$and來表達,只用:

$ne=>nil, $ne=>"" 
+0

你是指這裏的mongoid語法,還是mongo?試着從你的建議推斷,我已經在mongoid中嘗試了這兩個:where(:name.ne => nil,:name.ne =>「」),其中(:address => {「$ ne」=>「 「,」$ ne「=>無})。在這兩種情況下,mongoid似乎都在破壞標準,所以前者最終以{:name => {「$ ne」=>「」}}作爲選擇器,後者以{:address =>結束{「$ ne」=> nil}} – kclair 2012-03-09 23:43:32

+0

對不起,是的,mongo語法是: {address:{$ ne:null},address:{$ ne:「」}} – 2012-03-10 00:07:34

+0

看起來像排除是正確的在mongoid中做? Model.excludes(地址:nil,地址:「」) - 或者可能不是,因爲它是一個嵌入式文檔... – 2012-03-10 00:12:14