我有一个模型用户,我在其中大量使用动态属性。当我显示用户显示时,我跳过第一组属性以跳过 id 等。问题是属性是按字母顺序排序的,而不是按创建顺序排序的因此,例如,如果我创建一个用户为:
MONGODB startuplab_co_development['users'].insert([{"provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "_id"=>BSON::ObjectId('4dc5ad606acb26049e000002'), "email"=>"dan@gmail.com", "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
无论如何,我可以确保属性位置保持插入顺序吗?
下面是属性排序的事件链
- 创建后 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: "danpal@gmail.com", 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"=>"danpal@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio"}
- 现在我们更新 admin 属性并保存它,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"=>"danpal@gmail.com", "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"=>"danpal@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "admin"=>true}
- 知道我们再次从数据库中检索对象,uid 现在是最后一个属性,它们已按字母顺序排序。
ruby-1.9.2-p0 > user = User.first
=> #
ruby-1.9.2-p0 > user.attributes
=> {"_id"=>BSON::ObjectId('4dc5c5946acb26049e000005'), "admin"=>true, "email"=>"danpal@gmail.com", "first_name"=>"Daniel", "last_name"=>"Palacio", "name"=>"Daniel Palacio", "provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_"}
这是答案:
基本上在更新期间,如果文档分配的空间不足(例如,更新添加一个新字段或增加现有字段),文档将被移动并且字段被重新排序(字母数字)。
来自 MOngoDB 文档:http://www.mongodb.org/display/DOCS/Updating
字段(重新)排序
在更新期间,字段顺序可能会 被改变。无法保证 字段顺序将保持一致,或者 更新后也是如此。在 时刻,如果可以应用更新 到位,那么订单将是 相同(在 结束),但如果需要移动 文档(如果当前 分配的空间不足以 更新)然后字段将是 重新排序(字母数字)。