2012-03-12 3 views
7

Я рассмотрел некоторые вопросы на сайте и не совсем понял, что я делаю неправильно. Я какой-то код, как это:Обновление Mongoose/upsert?

var mongoose = require('mongoose'), 
db = mongoose.connect('mongodb://localhost/lastfm'), 
Schema = mongoose.Schema, 
User = new Schema({ 
    nick: String, 
    hmask: String, 
    lastfm: String 
}); 
var UserModel = mongoose.model('User', User); 

//Register user to mongodb 
var reg_handler = function (act) { 
// should add a new entry to the db if nick (act.nick) && hmask (act.host) 
// aren't already in the db. Otherwise, update the entry that matches nick 
// or hostmask with the new lastfm name (act.params) 
}; 

var get_handler = function (act) { 
    UserModel.find({ nick: act.params }, function (err, users) { 
    if (err) { console.log(err) }; 
    users.forEach(function (user) { 
     console.log('url for user is http://url/' + user.lastfm); 
    }); 
    }); 
}; 

Я не уверен, что я должен делать в середине есть, чтобы получить его, чтобы обновить базу данных должным образом. Я пробовал немало вещей, не могу отменить, чтобы узнать все, что я пробовал. Это заняло большую часть моей ночи, и я хочу, чтобы она работала.

Это почти то, что я хочу, я задаюсь вопросом, есть ли способ сделать или в условиях части .update()

var reg_handler = function (act) { 
    var lfmuser = { nick: act.nick, hmask: act.host, lastfm: act.params }; 
    UserModel.update({ nick: act.nick }, { $set: lfmuser }, { upsert: true }, function(){}); 
}; 

Я буду держать играл вокруг с ним.

ответ

10
var reg_handler = function (act) { 
    UserModel.update({ $or: [{nick: act.nick}, {hmask: act.host}] }, { $set: { lastfm: act.params } }, { upsert: true }, function(){}); 
}; 

Это именно то, что я хотел, и это одна линия. : D Отлично!

+5

Возможно, вы захотите добавить некоторую обработку ошибок к этой последней функции;) – staackuser2

0

Как об этом (не проверить, но должен работать с последними мангуста):

UserModel.findAndModify({nick: act.nick, hmask: act.host}, [], {$set: {lastfm: act.params}}, {}, callback); 
+0

Будет ли это проверено, он получил его для работы с .update(). Я не знаю, что я делал неправильно раньше, но теперь все отлично. – Rob

+0

Нет, это терпит крах. Отвечу тем, что я, наконец, приступил к работе. – Rob

9

Использовать findOneAndUpdate с опцией 'upsert', равной true.

+2

Есть ли причина, по которой это лучше (или хуже), чем 'Model.update()' в принятом ответе? – joeytwiddle

+1

@joeytwiddle, что я хотел бы предложить, если вы хотите только обновить и не вернуть запись, а затем обновить модель, в противном случае findOneAndUpdate будет работать, если вы хотите вернуть запись. –

0

сначала необходимо определить схему для конкретной коллекции

пользователя схемы:

username: {type: String, required: true, upsert: true }

использование в коде:

.findOne({ emailId: toEmail }) 
.update({$set: { username: ravi }}) 
.exec() 
0

Вы можете использовать findOneAndUpdate() и необходимость установить {new: true}. Вы можете проверить 4.0.0 release notes, согласно которому «по-новому» по умолчанию false.

UserModel.findOneAndUpdate(
    { nick: act.nick },  //your condition for check 
    { $set: lfmuser },  //new values you want to set 
    { upsert: true, 'new': true }).exec(function (err, data){ 
     //your result  
    }); 
); 
Смежные вопросы