如何使用Ruby Mongoid Moped使用upsert选项进行更新

时间:2014-10-15 11:14:40

标签: ruby-on-rails ruby mongodb mongoid moped

如果数据已经存在,我需要更新MongoDB中的一些数据,如果不是upsert或用这些数据创建记录。 我的模特是:

class Garage 
  include Mongoid::Document
   include Mongoid::Attributes::Dynamic


  has_many :cars
 end

class Car
  include Mongoid::Document
   include Mongoid::Attributes::Dynamic

  belongs_to :garage
  index({ car_make: 1, plate_number: 1  }, { sparse: true, unique: true, drop_dups: true })
 end

然后我有了这个查询

 Garage.cars.collecttion.find(:car_make => "Ford", :plate_number =>"12x234")
.update(:car_make => "Ford", :plate_number =>"12x234", :car_colour=>"red", :year_make="2012", {upsert: true}) 

但是此查询不会将Garage _id添加到cars,因此无法正常运行。 我还尝试了另一个问题:

Garage.cars.where(:car_make => "Ford", :plate_number =>"12x234")
    .update(:car_make => "Ford", :plate_number =>"12x234", :car_colour=>"red", :year_make="2012") 

但它不需要{upsert: true}选项,因此如果它还不存在则不创建记录! 然后我尝试了这个:

Garage.cars.where(:car_make => "Ford", :plate_number =>"12x234")
        .find_and_modify(:car_make => "Ford", :plate_number =>"12x234", :car_colour=>"red", :year_make="2012", {upsert: true}) 

获取错误:

failed with error 11000: "exception: insertDocument :: caused by :: 11000 E11000 duplicate key 

有人知道如何解决这个问题吗?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

Garage.cars.where(:car_make => "Ford", :plate_number =>"12x234").upsert(:car_make => "Ford", :plate_number =>"12x234", :car_colour=>"red", :year_make="2012")

试试这个......不确定这是否有用