2011-05-07 99 views
1

我有一個模型用戶,我大量使用動態屬性。 當我顯示用戶顯示時,我跳過第一組屬性以跳過標識等。 問題是屬性按字母順序排序,而不是按創建順序排列 因此,例如,如果我創建用戶爲:Mongodb mongoid模型屬性按字母順序排序不是插入順序


MONGODB startuplab_co_development['users'].insert([{"provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "_id"=>BSON::ObjectId('4dc5ad606acb26049e000002'), "email"=>"[email protected]", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio"}]) 

即使插入第二個屬性是uid,當我檢索鍵時,它們按字母順序排序。


%h1 User 
%ul 
-keys = @user.attributes.keys[3..-1] 
- keys.each do |key| 
    %li 
    %span 
     %strong= "#{key.capitalize()}:" 
    %span= "#{@user[key]}" 

因此,例如,這將打印UID作爲最後一個屬性,因爲它們被排序。


First_name: Daniel 
Last_name: Palacio 
Name: Daniel Palacio 
Provider: google 
Uid: https://www.google.com/accounts/o8/id?id=AItOawl_oas_8jcY1VSTQchsc 

是否有無論如何我可以確保屬性位置保持插入順序?

下面是一連串事件,其中屬性得到分類

  1. 創建UID之後是第三屬性


ruby-1.9.2-p0 > user = User.first 
=> _id: 4dc5c5946acb26049e000005, _type: nil, _id: BSON::ObjectId('4dc5c5946acb26049e000005'), provider: "google", uid: "https://www.google.com/accounts/o8/id?id=AItOawl_oas_", admin: nil, email: "[email protected]", first_name: "Daniel", last_name: "Palacio", name: "Daniel Palacio"> 

ruby-1.9.2-p0 > user.attributes 
=> {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "email"=>"[email protected]", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio"} 

  1. 現在我們更新了管理屬性,並保存它, uid仍然是第3個屬性


ruby-1.9.2-p0 > user.update_attributes(:admin => true) 
=> true 
ruby-1.9.2-p0 > user.attributes 
=> {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "email"=>"[email protected]", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "admin"=>true} 

ruby-1.9.2-p0 > user.save 
=> true 

ruby-1.9.2-p0 > user.attributes 
=> {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "email"=>"[email protected]", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "admin"=>true} 

  1. 知道我們再次從數據庫中檢索對象,uid現在是最後一個屬性,並且它們已按字母順序排序。


ruby-1.9.2-p0 > user = User.first 
=> # 
ruby-1.9.2-p0 > user.attributes 
=> {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "admin"=>true, "email"=>"[email protected]", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_"} 

回答

4

確定這裏就是答案:在更新過程中

基本上,如果文檔分配的空間是不夠的(如:becouse更新添加一個新的領域或增長的現有字段),該文件將被移動並且字段被重新排序(字母數字)。

從MongoDB的文檔: http://www.mongodb.org/display/DOCS/Updating

字段(重新)命令

在更新期間的場順序可能 被改變。不能保證 的字段順序會一致,或者 更新後一樣。在 時刻,如果更新可以在適當位置應用 那麼該命令將是 相同(與在 端應用添加),但如果此舉需要 文件(如果當前 分配的空間不足以更新 ),那麼字段將被重新排序(字母數字) 。