2012-07-28 5 views
2

잠시 동안 코드를 변경하지 않아도 정상적으로 작동합니다. 어제 시작되었지만, 몽고메드를 통해 mongod db에 새로운 기록을 저장할 수 없다는 것을 알았습니다.mongoid 및 MongoDB를 사용하여 새 레코드를 내 레일 모델에 저장할 수 없습니다.

배경 :

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

몽고 서버 버전 : DB 버전 V2.0.5, pdfile 버전 4.5 MongoDB의 쉘 버전 : 2.0.5

는 모델 (정지 _ 모드) 데이터 사이즈 레일 : 3 모델 (사용자 : 164K, 관계 : 122M, 상태 : 370K)

문제 : 새로운 사용자 레코드를 여기에 표시된대로 컨셉트를 통과하더라도 저장할 수 없습니다 (고유 한 uid, id _str). 작업이

은 무엇 절약하지 문제를 일으키는 이유가 될 수 있도록 빠른로 mongodb.log 파일에

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) 

아무것도 :

[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 

레일 로그 파일을?

업데이트 : 몽고 쉘에서 내 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 

운영 체제는 다음과 같습니다 2.6.38-8-일반적인 # 42 우분투 SMP 월 4월 11일 세계 협정시 03시 31분 24초 2011 x86_64에의 x86_64에의 x86_64의 GNU/Linux

+0

db.users.stats()의 DB 쉘 출력은 어떻게 생겼습니까? 그리고 당신은 어떤 O/S를 사용하고 있습니까? – Stennie

+0

이 질문에 업데이트했습니다. 내 DB에 잘 보인다. –

+0

그냥 create를 사용해보십시오. db에 저장할 수 있습니까? 나는 얻을 수 없었다 : ( – Bijendra

답변

4

save 메서드는 "upsert"의미 체계를 따르고 있습니다. 기준 ((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이 필요합니다.

+0

사실, 데이터베이스에 중복 된 레코드가 있었는데 나중에 찾으십시오. 그래서 "저장"과 "삽입"을 구별해야합니다. 감사합니다. . –

관련 문제