如果至少存在一个重复项,Mongoid会忽略collection.insert

时间:2012-08-01 05:26:01

标签: mongoid

我有一个独特的索引设置,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'}

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在寻找带有continue_on_error的插入批处理 而不是我认为你已经被告知的单个文件更新/ upsert。

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使用Moped驱动程序而不是10gen驱动程序。 在您使用的1.1.6 gem中,轻便摩托车不支持选项/标志, 但Durran在7月28日左右在github中为插入方法添加了标记。

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

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

从具有moped 1.2.0的mongoid 3.0.3开始,以下带有continue_on_error的插入批处理工作。

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

请注意,批量插入的insert方法的主要参数是Array对象 括在方括号内 - 您的帖子中缺少方括号。

希望这会有所帮助。