2015-12-08 5 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)
  • push продукты

Это работает для 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) 

Где:

  • $ набор - являются Титулы, которые мы хотим set для данного документа
  • $ pushAll - при использовании $ push вы можете указать только один элемент, $ PushAll позволяет добавлять несколько элементов (при указании только один он будет вести себя как $ толчок)
  • upsert - будет делать магию вставки/обновления в MongoDB

Во втором хэша вы можете также указать $ inc, $ dec, $ pop, $ set и т. д., что весьма полезно.

Смежные вопросы