无法使用mongoid和MongoDB将新记录保存到我的rails模型中

时间:2012-07-28 21:09:04

标签: ruby-on-rails mongodb mongoid

有一段时间没有更改我的代码,而且工作正常。但是从昨天开始,我发现我无法通过mongoid将我的新记录保存到mongod db。

背景:

gem 'rails', '3.2.5'
gem 'mongo', "1.6.2"
gem "mongoid", "2.4.7"

mongo服务器版本: db version v2.0.5,pdfile version 4.5 MongoDB shell版本:2.0.5

rails模型和数据大小(仍处于开发模式): 3个型号(用户:164K,关系:122M,状态:370K)

问题:无法保存新用户记录,如此处所示,即使它传递了约束(就像我有唯一的uid,id_str)。

[2] pry(main)> User.count
=> 164325
[3] pry(main)> u=User.new(uid: 1001, id_str: "1001")
=> #<User _id: 501452f346b0a14fb5000001, _type: nil, created_at: nil, updated_at: nil, uid: 1001, id_str: "1001", name: nil, screen_name: nil, location: nil>
[4] pry(main)> u.save
=> true
[5] pry(main)> User.count
=> 164325
[6] pry(main)> u.save!
=> true
[7] pry(main)> User.count
=> 164325

Rails日志文件:

MONGODB (0ms) blog_development['$cmd'].find({"count"=>"users", "query"=>{}, "fields"=>nil}).limit(-1)
MONGODB (0ms) blog_development['users'].insert([{"_id"=>BSON::ObjectId('501452f346b0a14fb5000001'), "uid"=>1001, "id_str"=>"1001", "updated_at"=>2012-07-28 21:00:39 UTC, "created_at"=>2012-07-28 21:00:39 UTC}])
MONGODB (0ms) blog_development['$cmd'].find({"count"=>"users", "query"=>{}, "fields"=>nil}).limit(-1)
MONGODB (0ms) blog_development['$cmd'].find({"count"=>"users", "query"=>{}, "fields"=>nil}).limit(-1)

mongodb.log文件中没有任何内容,因为操作太快了

造成非保存问题的原因是什么?

更新: 我在mongo shell中的db状态:

"ns" : "blog_development.users",
    "count" : 164325,
    "size" : 159656080,
    "avgObjSize" : 971.5872813022972,
    "storageSize" : 177336320,
    "numExtents" : 14,
    "nindexes" : 3,
    "lastExtentSize" : 36089856,
    "paddingFactor" : 1.0099999999963194,
    "flags" : 1,
    "totalIndexSize" : 22729280,
    "indexSizes" : {
        "_id_" : 9598624,
        "uid_1" : 6091120,
        "screen_name_1" : 7039536
    },
    "ok" : 1

os是:2.6.38-8-generic#42-Ubuntu SMP Mon Apr 11 03:31:24 UTC 2011 x86_64 x86_64 x86_64 GNU / Linux

1 个答案:

答案 0 :(得分:4)

您正在使用“upsert”语义后面的save方法。如果找到符合条件((uid: 1001, id_str: "1001"))的现有文档,则会更新该文档而不是插入新文档。

 u=User.new(uid: 1001, id_str: "1001")

 u.save
=> true

由于您实际上打算创建新文档,因此您应该使用insert

u.insert

或者,您也可以在班级中允许自定义_id并在创建时指定此项。默认情况下,您需要override Mongoid's _id field只读。