Mongodb mongoid模型属性按字母顺序而不是插入顺序排序

Mongodb mongoid模型属性按字母顺序而不是插入顺序排序,mongodb,mongoid,ruby-on-rails-3,Mongodb,Mongoid,Ruby On Rails 3,我有一个模型用户,在那里我大量使用动态属性。 当我显示用户显示时,我跳过第一组属性以跳过id等。 问题是属性是按字母顺序排序的,而不是按创建顺序排序的 例如,如果我将用户创建为: MONGODB startuplab_co_development['users'].insert([{"provider"=>"google", "uid"=>"https://www.google.com/accounts/o8/id?id=AItOawl_oas_", "_id"=>BSON::ObjectId

我有一个模型用户,在那里我大量使用动态属性。 当我显示用户显示时,我跳过第一组属性以跳过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是第三个属性
  • 现在我们更新admin属性并保存它,uid仍然是第三个属性
  • 要知道,我们再次从数据库中检索对象,uid现在是最后一个属性,它们已按字母顺序排序
  • 好的,答案如下:

    基本上,在更新期间,如果文档分配的空间不足(例如,由于更新添加了一个新字段或增加了一个现有字段),文档将被移动,字段将被重新排序(字母数字)

    从MOngoDB文档:

    现场(再)订单

    在更新过程中,可能会更改字段顺序 可以改变。不能保证 字段顺序将保持一致,或 同样,在更新之后。在 时刻,如果可以应用更新 在适当的地方,订单将是 相同(添加到 结束),但如果需要移动 文档(如果当前 分配的空间不足,无法安装 更新)则字段将被删除 重新排序(字母数字)

    好的,答案如下:

    基本上,在更新期间,如果文档分配的空间不足(例如,由于更新添加了一个新字段或增加了一个现有字段),文档将被移动,字段将被重新排序(字母数字)

    从MOngoDB文档:

    现场(再)订单

    在更新过程中,可能会更改字段顺序 可以改变。不能保证 字段顺序将保持一致,或 同样,在更新之后。在 时刻,如果可以应用更新 在适当的地方,订单将是 相同(添加到 结束),但如果需要移动 文档(如果当前 分配的空间不足,无法安装 更新)则字段将被删除 重新排序(字母数字)

    
    
    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"} 
    
    
    
    
    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} 
    
    
    
    
    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_"}