我有一个独特的索引设置,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'}
?
谢谢!
答案 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对象 括在方括号内 - 您的帖子中缺少方括号。
希望这会有所帮助。