2

しばらくコードを変更していませんでしたが、問題なく動作していました。しかし、昨日始めて、新しいレコードをmongoid経由でmongod dbに保存できないことがわかりました。

バックグラウンド:

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

mongo サーバー バージョン: db バージョン v2.0.5、pdffile バージョン 4.5 MongoDB シェル バージョン: 2.0.5

railsのモデルとデータサイズ(まだ開発中): 3モデル (users: 164K, relationship: 122M, status: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 シェルでの私の 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

4

1 に答える 1

4

「 upsert」セマンティクスsaveに従うメソッドを使用しています。基準 ( ) に一致する既存のドキュメントがある場合、新しいドキュメントを挿入する代わりに更新されます。(uid: 1001, id_str: "1001")

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

 u.save
=> true

実際には新しいドキュメントを作成するつもりだったので、次を使用する必要がありますinsert

u.insert

_idまたは、クラスでカスタムを許可し、作成時にこれを指定することもできます。デフォルトでは読み取り専用であるMongoid の _id フィールドをオーバーライドする必要があります。

于 2012-08-02T03:03:34.630 に答える