0

私はユニークなインデックスを設定しています。drop_dup: true

index({ key1: 1, key2: 1 }, { unique: true, drop_dups: true })

複数のレコードを挿入する場合、MySQL の場合と同様に、非重複が成功することを望みます

INSERT IGNORE INTO table ...

.. あるいはINSERT INTO table ... ON DUPLICATE KEY UPDATE

したがって、記録がある場合:

Model.collection.insert({'key1'=>'not-unique', 'key2'=>'boo'})

次の呼び出しは何もしないようです。

Model.collection.insert(

{'key1'=>'not-unique', 'key2'=>'boo'},

{'key1'=>'im-unique', 'key2'=>'me-too'}

)

少なくとも{'key1'=>'im-unique', 'key2'=>'me-too'}2 番目の呼び出しに挿入する方法はありますか?

ありがとう!

4

1 に答える 1

0

すでに通知されていると思われる単一のドキュメントの更新/アップサートではなく、continue_on_errorを使用した挿入バッチを探しているようです。

http://api.mongodb.org/ruby/current/Mongo/Collection.html#insert-instance_method

10genドライバーを使用すると、ユーザーモデルを使用した例と同等になります。

Gemfile

gem 'mongo'
gem 'bson_ext'

test / unit / user_test.rb(抜粋)

col = Mongo::Connection.new['sandbox_test']['users']
col.insert({'key1'=>'not-unique', 'key2'=>'boo'})
assert_equal(1, User.count)
col.insert([{'key1'=>'not-unique', 'key2'=>'boo'},{'key1'=>'im-unique', 'key2'=>'me-too'}], :continue_on_error => true)
assert_equal(2, User.count)

上記は単純な単体テストで機能します。

Mongoid 3は、10genドライバーの代わりにMopedドライバーを使用します。使用している1.1.6gemでは、mopedはオプション/フラグをサポートしていませんが、Durranはgithubの7月28日頃にinsertメソッドにフラグを追加しました。

https://github.com/mongoid/moped/commit/2c7d6cded23f64f436fd9e992ddc98bbb7bbdaae

https://github.com/mongoid/moped/commit/f8157b43ef0e13da85dbfcb7a6dbebfa1fc8735c

moped1.2.0を使用したmongoid3.0.3の時点で、continue_on_errorを使用した次の挿入バッチが機能します。

Model.collection.insert([{'key1'=>'not-unique', 'key2'=>'boo'},{'key1'=>'im-unique', 'key2'=>'me-too'}], [:continue_on_error])

バッチ挿入のinsertメソッドの主なパラメーターは、角かっこで囲まれたArrayオブジェクトであることに注意してください。角かっこは投稿に含まれていません。

これがお役に立てば幸いです。

于 2012-08-02T13:37:24.057 に答える