Upsert хэш в mongodb. Удалить неиспользуемые ключи

Из документации Mongo:

Если вы укажете несколько пар поле-значение, $set обновит или создаст каждое поле.

У меня есть такой монгоидный документ:

class MyCounter
  include Mongoid::Document

  field :date, type: Date
  field :properties, type: Hash
end

и когда я пытаюсь изменить свойства следующим образом:

hash = {properties.0 => 50, properties.1 => 100 }
MyCounter.where(something).find_and_modify(
    { '$set' => hash, {'upsert' => 'true', new: true}
)

он сохраняет старые ключи в хэше свойства.

Как правильно полностью заменить (и создать новый документ, если он не существует) хэш в документе?

ИЗМЕНИТЬ

Я сейчас делаю это, что глупо:

MyCounter.where(
  date: date
).find_and_modify(
  { '$unset' => { properties: nil} }, {'upsert' => 'true', new: true}
)

MyCounter.where(
  date: date
).find_and_modify(
  { '$set' => hash }, {'upsert' => 'true', new: true}
)

person dcarneiro    schedule 06.03.2015    source источник
comment
Что для вас значит неиспользованный? Конечно, если вы ожидаете, что вся структура объекта будет такой, какой вы ожидаете ее видеть прямо сейчас, просто замените ее.   -  person Neil Lunn    schedule 06.03.2015
comment
@NeilLunn Если свойства равны {a: 100, b: 200}, а новое значение равно {b: 500, c: 600}, я заканчиваю на {a: 100, b: 500, c: 600}. Я не хочу ключ.   -  person dcarneiro    schedule 06.03.2015


Ответы (1)


Просто не используйте $set. При передаче только пар field: value все поля заменяются (кроме поля _id)

Это должно работать нормально.

MyCounter.where(
  date: date
).find_and_modify(
  hash, {'upsert' => 'true', new: true}
)

http://docs.mongodb.org/manual/reference/method/db.collection.update/#example-update-replace-fields

person Ismael    schedule 07.03.2015
comment
Без $set if выдает следующую ошибку: сбой с ошибкой 57: исключение: пунктирное поле «properties.0» в «properties.0» недопустимо для хранения. - person dcarneiro; 09.03.2015
comment
Вы, вероятно, не можете использовать запись через точку для полной замены документа. Старайтесь не использовать точечную нотацию следующим образом: {properties: { '0' => "" }} - person Ismael; 09.03.2015