【问题标题】:Mongoid ignores collection.insert if at least one duplicate exists如果至少存在一个重复项,则 Mongoid 会忽略 collection.insert
【发布时间】:2012-08-01 05:26:00
【问题描述】:

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

谢谢!

【问题讨论】:

  • 您使用的是什么版本的 Rails 和 Mongoid?
  • Rails 3.1.1 和 Mongoid 3.0.0 .. 谢谢

标签: mongoid


【解决方案1】:

看来您正在寻找带有 continue_on_error 的插入批处理 而不是我认为您已经知道的单个文档更新/更新。

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

使用 10gen 驱动程序,与您的用户模型示例等效的是:

宝石文件

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 中为 insert 方法添加了标志。

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

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

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

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

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

希望这会有所帮助。

【讨论】:

  • 谢谢 Gary,我会对此进行测试并报告。
  • 抱歉回复晚了。那工作得很好。有没有collection.update,类似于SQL的ON DUPLICATE KEY UPDATE
  • 我想我正在寻找一批upsert。我从MongoDB site 中找到了这句话“重要的是要记住 upsert 只能插入一个文档。”:这是否意味着不能批量更新?
  • 是的,您没看错,没有批量更新插入。请注意,术语批量更新可能有点令人困惑。虽然更新请求只为条件/选择器和 objNew/document 使用单个文档参数,但在 update(-non-insert) 情况下,多个文档可以作为“批次”更新。
  • 请注意,Mongoid::Persistence::Operations(包含在 User 中)、Moped::Collection(User.collection) 和 Mongo::Collection 之间存在重要区别。 Mongoid(Durran Jordan 的 ODM)在您的模型上有 insert(only)、update(only(?)) 和 upsert 方法。 Moped(Bernerd Schaefer 的 Ruby 驱动程序)在 Moped::Collection 上只有 insert 方法; update 和 upsert 方法是链接到 find 方法的“协议”。 Mongo(10gen 的 Ruby 驱动程序)在 Collection 上有 insert、update-with-upsert-option 和 save(upsert 或 insert)方法。欢迎使用开源 - 您有很多选择!
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多