2015-12-08 64 views
0

我有模型用戶:Mongoid一推UPSERT

class User 
    field :username, type: String 
    embeds_many :products 
end 

class Product 
    field :name, type: String 
    embedded_in :user 
end 

我想有一個操作會:

  • 插入用戶
  • 更新用戶的情況下,用戶已經存在(這個我可以很容易地UPSERT做)
  • 推產品

這適用於upserting:

User.new(username: 'Hello').upsert 

的問題是,這將刪除嵌入式產品(產品屬性沒有指定)。

我可以問mongoid跳過設置數組爲空嗎? 我可以讓mongoid在產品陣列的最後推新產品嗎? 事情是這樣的:

User.new(username: 'Hello').push(products: [Product.new(name: 'Screen')]).upsert

回答

0

最後我結束了手動編寫以下查詢:

User.mongo_client[:users].update_one({username: 'Hello'}, 
            {"$set" => {first_name: 'Jim', last_name: 'Jones'}, 
             "$pushAll" => [products: [{name: 'Screen'}, {name: 'Keyboard'}] 
            }, 
            upsert: true) 

其中:

  • $設置 - 是我們想要的PARAMS爲給定的文件設置
  • $ pushAll - 當您使用$ push時,您只能指定一個元素, $ pushAll允許您添加多個元素(當你指定一個它會像$推送)
  • UPSERT - 會做插入/更新魔術在MongoDB的

在第二哈希你也可以指定$ inc,$ dec,$ pop,$ set等......這非常有用。