默認情況下mongoid有權刪除空字段的能力。如果你讓一些字段爲空,mongoid會在插入時刪除它們。
在下面的示例中
,我離開了字段元件& RECT
class User
include Mongoid::Document
field :key, type: String
field :element, type: String
field :rect, type: Array
embeds_one :home
end
>> u=User.new(:key=>'ram').to_json
=> "{"_id":"4f1c3722b356f82e4a000001","_type":"key":"ram"}"
和它完美。但是,如果你在該字段中輸入零值,那麼它將被插入。假設這是你代碼中的確切問題。所以,你可以解決此通過轉換使用JSON as_json
哈希表示並取出零領域
x=u.as_json.reject! {|k,v| v.nil?}
=> "{"_id":"4f1c3722b356f82e4a000001","_type":"User","key":"ram"}"
但去到內部的水平,則不能使用as_json。檢查下面的代碼
>>h=Home.new(:address=>'xxxx',:dummy=>nil)
>>u.home = h
>>x=u.as_json.reject! {|k,v| v.nil?}
=>{"_id"=>BSON::ObjectId('4f1c39b4b356f82e4a000003'), "_type"=>"User","key":"ram","home"=>#<Home _id: 4f1c3c5db356f82e4a000004,address:'xxxx' , dummy: nil >}
現在你看到嵌入文檔屋內場虛擬仍與零。所以我最好的建議是不要把db的零值全部寫入。要做到這一點,在您的模型上嵌入before_save
回調(嵌入),並刪除空字段。
另外我會告訴你如何從嵌套對象中刪除零字段。使用它,如果沒有其他的辦法
我們可以用mongoid模型attributes
來獲取對象的散列表示包括嵌套級別
x=u.attributes
=> {"_id"=>BSON::ObjectId4f1c39b4b356f82e4a000003,"key"=>"ram","element"=>nil,"home"=>{"address"=>"xxxx", "_id"=>BSON::ObjectId4f1c3c5db356f82e4a000004,"dummy"=>nil}}
,你必須發現有任何哈希mongoid內對象,如果有,我們必須使用reject! {|k,v| v.nil?}
對哈希太
放在一起的所有
def to_json(obj)
obj.reject! {|k,v| v.nil?}
obj.find_all {|x| x[1].class==BSON::OrderedHash}.each do |arr|
obj[arr[0]] = to_json(arr[1])
end
obj
end
,並呼籲日是與模型的屬性
>> to_json u.attributes
=> {"_id"=>BSON::ObjectId4f1c39b4b356f82e4a000003,"key"=>"ram","home"=>{"address"=>"xxxx", "_id"=>BSON::ObjectId4f1c3c5db356f82e4a000004}}
那就是所有。希望它有幫助
一些示例數據/預期的輸入/輸出將在這裏有所幫助 – Yule 2012-01-04 17:00:26
在模型上調用to_json時,它可以正常工作。 JSON對象沒有任何空的字段?你正在使用哪個版本的mongoid?並調用your_doc_obj.to_json它返回null? – RameshVel 2012-01-22 16:16:27
它有空字段。這個例子中只有一個字段是填充的,另一個是空值,我想將它們去掉。我也想刪除其他字段(但那些我將剝離:attr_protected) – CamelCamelCamel 2012-01-22 16:24:40