Рекомендации по обновлению коллекции MongoDB с неизвестными измененными полями

Итак, я создаю приложение с использованием PHP и MongoDB, которое будет иметь значительный трафик как при чтении, так и при записи. Через пару месяцев должно быть около 2500 операций чтения в секунду и 200 операций записи в секунду (не знаю, как это на самом деле). ставки с точки зрения трафика по сравнению с другими).

Мне немного любопытно, что делать при обновлении коллекции; примеры документации показывают, как оболочка обновляет определенное поле коллекции, но не объясняют, что происходит, когда любое количество полей из коллекции может быть изменено.

Например, скажем, у меня есть коллекция пользователей (очень упрощенный пример):

user = {
  _id     :  MongoId(...),
  name    : 'User One',
  email   : '[email protected]',
  company : 'Company',
  ...
}

Мы показываем все редактируемые поля в форме, но пользователь меняет только свой адрес электронной почты.

Строго говоря, с точки зрения производительности, было бы лучше сохранить исходные значения в скрытых входных данных, чтобы сравнить их в PHP, а затем построить запрос, специфичный для обновления?

Или я все равно должен заменить все редактируемые поля?

Это будет коллекция, содержащая объекты и массивы друг в друге, а не простая, показанная здесь.

Я знаю, что оптимизация приходит позже, но я также хочу набраться хороших привычек с MongoDB.

Спасибо.


person tonyhb    schedule 18.10.2010    source источник


Ответы (1)


Вы, вероятно, будете извлекать весь объект, чтобы отобразить редактируемую форму — здесь я предполагаю, что вы будете отображать текущее имя, адрес электронной почты и т. д. и позволите им редактировать и отправлять новые версии. Это означает, что вы можете проверить, что изменилось, и обновить это конкретно, вместо того, чтобы каждый раз загружать и заменять весь объект.

Я бы предложил использовать оптимизированные операции обновления: Обновление MongoDB. Таким образом, вы можете выполнять более оптимизированные операции на месте, а не заменять весь объект каждый раз, когда вы хотите отредактировать определенное поле. Вы, вероятно, будете смотреть в основном на $set, $addToSet и (если вы имеете дело с большим количеством вложенных объектов, позиционный оператор $.

Из документов:

Операции с модификаторами

Операции модификатора очень эффективны и полезны при обновлении существующих значений; например, они отлично подходят для увеличения числа. [И другие более сложные вещи]

...

Преимущество обновления модификатора заключается в том, что он позволяет избежать задержки, связанной с запросом и возвратом объекта. Обновление модификатора также отличается атомарностью операций и очень малой передачей сетевых данных.

Если у вас есть более конкретные вопросы по реализации той или иной операции, просто задайте их.

person nearlymonolith    schedule 18.10.2010