2015-10-14 3 views
1

Так что я знаю, что этот вопрос задан много раз, но я искал его более 30 минут, и я честно не могу найти то, что я делаю неправильно.Обновление нескольких документов MongoDB в NodeJS не работает

Я хочу, чтобы обновить свои данные Монго

Вот пример двух документов

{ 
    "_id" : ObjectId("561e34c68b7639481c38ce62"), 
    "id" : "1657999143", 
    "timeTakenAt" : 1444820166833.0000000000000000, 
    "userName" : "a", 
    "__v" : 0 
} 

{ 
    "_id" : ObjectId("561e34c68b7639481c38ce63"), 
    "id" : "1659143", 
    "timeTakenAt" : 1444820166833.0000000000000000, 
    "userName" : "b", 
    "__v" : 0 
} 

Я хочу, чтобы изменить имена пользователей к чему-то еще.

Например, JOHN CENA.

Вот код, который я использую.

... 
var UserModel = mongoose.model('userSchema', userSchema); 
... 

updateUsers() 

function updateUsers(){ 
    UserModel.update({}, {$set: {userName: 'JOHN CENA'}}, {multi:true}) 
} 

Но это не сработает, даже ни один документ не изменен. Я также обнаружил, что некоторые люди использовали

UserModel.update({}, {$set: {userName: 'JOHN CENA'}}, false,true) 

Но что один дает мне ошибку, поэтому я предполагаю, что это код из старой версии.

Однако, если я использую

UserModel.update({}, {$set: {userName: 'JOHN CENA'}}, {multi:true}, updateUsers) 

(который, очевидно, зацикливается, так как он называет себя). Каждый документ заканчивается обновлением с именем пользователя JOHN CENA.

Я не понимаю, что здесь происходит, может ли кто-нибудь помочь мне, пожалуйста?

EDIT: В комментариях ниже пользователь предложил добавить пустой обратный вызов. Что я сделал, и теперь он работает по назначению. Я благодарю его (@Sergio Tulentsev), и я надеюсь, что эта нить поможет кому-то еще в будущем.

+0

Действительно, это должно было сработать. Какие версии вы используете (mongodb, node.js, mongoose)? –

+0

Что делать, если вы предоставляете пустой обратный вызов (хотя это должно быть проблемой)? –

+0

@ Сергио Туленцев Я загрузил три из этих трех недель назад. Поэтому я уверен, что у меня есть последняя версия. EDIT: Я просто добавил пустой обратный вызов, и теперь он работает по какой-то причине. Ну, теперь моя проблема решена, спасибо! – Skum

ответ

2

Как отмечено в документации для update, если вы не хотите, чтобы обеспечить обратный вызов, вам нужно позвонить exec на возвращенном Query выполнить его:

Чтобы обновить документы, не дожидаясь ответа из MongoDB, сделать не передать функцию обратного вызова, а затем вызвать exec на возвращаемом Query

Так как цепь в exec вызов на вашем update или обеспечить обратный вызов:

function updateUsers(){ 
    UserModel.update({}, {$set: {userName: 'JOHN CENA'}}, {multi:true}).exec(); 
} 

ИЛИ

function updateUsers(){ 
    UserModel.update({}, {$set: {userName: 'JOHN CENA'}}, {multi:true}, 
     function(err, numAffected) {...}); 
} 
Смежные вопросы