2013-03-18 2 views
3

У меня есть документ в mongodatabaseОбновить документ, только если он отличается от базы данных?

user:{ 
    name:'bruce', 
    surname:'wayne', 
    job:'batman', 
    email:'[email protected]', 
} 

так, когда информация обновления пользователя, я должен:

  1. запроса в базу данных, если пользователь существует
  2. если существует получить значение базы данных
  3. сравнить значения базы данных со значениями формы, отправленными от пользователя
  4. если значения из базы данных равны, отбросьте операцию
  5. , если значения из базы данных являются Diferent, обновлять значения с формой значения
  6. близко дб и sent.response

так в этом случае, если пользователь посылает это:

form.newUserInfo:{ 
    name:'bruce albert', 
    surname:'wayne', 
    job:'batman only at night', 
    email:'[email protected]', 
} 

просто обновить имя и задание.

Есть ли способ сделать это менее чем за 6 шагов? Я использую nodejs v0.10, mongodb 2.2.3, expressjs и mongoskin v0.5

+1

Если новые значения совпадают с старыми значениями, что может быть вредным для их замены? Пожалуйста, обновите свой вопрос, чтобы включить некоторую информацию о _why_, которую вы пытаетесь сделать, что может помочь другим ответить на ваш вопрос. –

+0

Я согласен с Мартином, что вы набираете с помощью этих шести шагов? Если два человека отредактируют запись одновременно, они все равно будут перезаписывать изменения друг друга. – robertc

+0

, если новые значения совпадают с старыми значениями, нет проблем с их заменой, поскольку они аналогичны старым, но возможно ли изменить только разные значения? и другая проблема заключается в том, когда пользователь сначала вводит значения ... i ahve, чтобы сначала проверить, если они существуют .. – andrescabana86

ответ

1

Похоже, вы хотите обновить конкретные поля результата, а не весь объект. То есть если пользователь только предоставляет параметры обновления для имени, вы хотите только обновить имя в базе данных. Используя свое имя: например, «Альбертс», то newUserInfo будет

newUserInfo: { 
    name: 'bruce albert', 
    surname: '', 
    job: '', 
    email: '' 
} 

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

В этом случае вы можете только оптимизировать пока.

  1. запроса в базу данных, если пользователь существует
  2. , если он существует получить значение базы данных
  3. сравнить значения базы данных со значениями формы, посланных от пользователя
  4. , если значения из базы данных являются равными, отказаться от операции
  5. , если значения из базы данных различны, обновить значения с формой значения
  6. близко дб и отправить ответ

Шаги 1 и 2 могут быть объединены, так как findOne() (или что-то в этом роде) вернет параметры соответствия записи, но только если объект существует. Если он не существует, вы можете вставить значения, переданные пользователем.

Шаг 4 можно удалить, потому что по существу он ничего не делает.

Шаг 5, вероятно, самый важный, поскольку вам нужно определить, как значения могут быть «разными». Подумайте, хотите ли вы обновить job = ''? Потому что это «отличается» от «batman», хотя вы можете не захотеть обновлять это значение.

Мои шаги будут

  1. Смотрите, если запись существует в базе данных.
    • Если это не ВСТАВИТЬ объект и перейдите к шагу 3
    • Если это произойдет, перейдите к шагу 2
  2. Сравните значения в объекте базы данных со значениями, поставляемых пользователем.
    • Если значения различны (в том виде, в котором вы хотите), обновите каждое поле по мере необходимости.
    • Если значения совпадают, то нет ничего, чтобы сделать, перейдите к шагу 3
  3. Закрыть дб и отправить ответ пользователю

Надеется, что это помогает.

2

Возможно, у вас есть необходимая информация из других комментариев/ответов. Но это довольно надежный способ повысить данные, которые у вас есть.

Используя $ findAndModify, вы можете управлять оптимистичным параллелизмом и повышать скорость.

Если вы хотите, чтобы вы могли найти различия, но если вы можете быть уверены, что документ такой же, как когда пользователь открыл его, вы бы использовали findAndModify для атомарного обновления документа, где значения были такими же, как документ когда он был загружен.

Часть обновления в этой команде обновляет все значение, но вы можете легко ограничить ее на основе различий, если хотите.

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

db.people.findAndModify({ 
    query: { 
     name:'bruce', 
     surname:'wayne', 
     job:'batman', 
     email:'[email protected]', 
    },  
    update: { 
     name:'bruce', 
     surname:'wayne', 
     job:'business owner', 
     email:'[email protected]', 
    }, 
    upsert: true 
    // uncomment next line to get the updated/new document return 
    // ,new : true 
}); 
Смежные вопросы