2012-03-12 11 views
7

Ho guardato alcune delle domande sul sito e non ho ben capito quello che sto facendo male. Ho un po 'di codice come questo:aggiornamento 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); 
    }); 
    }); 
}; 

Non sono sicuro di quello che dovrei fare in mezzo c'è per farlo per aggiornare il database in modo corretto. Ho provato parecchie cose, non può annullare per scoprire tutto quello che ho provato però. Mi ci è voluta una gran parte della mia notte e voglio che funzioni.

Questo è quasi quello che voglio, mi chiedo se non v'è alcun modo per fare un OR nella parte condizioni del .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(){}); 
}; 

terrò giocando intorno con esso.

risposta

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

Questo fa esattamente quello che volevo, ed è una linea. : D perfetto!

+5

Si potrebbe voler aggiungere un po 'di gestione degli errori a quest'ultima funzione;) – staackuser2

0

ne dite di questo (non si sono prova, ma dovrebbe lavoro con le ultime mangusta):

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

Lo verificherà, l'ha fatto funzionare correttamente con .update(). Non so cosa stavo sbagliando prima, ma ora funziona bene. – Rob

+0

No, questo si blocca. Risponderò a ciò che finalmente ho potuto lavorare. – Rob

9

Utilizzare findOneAndUpdate con l'opzione 'upsert' impostata su true.

+2

C'è qualche ragione per cui questo è migliore (o peggio) di 'Model.update()' nella risposta accettata? – joeytwiddle

+1

@joeytwiddle quello che vorrei suggerire è che se si vuole solo l'aggiornamento e non tornare il record, poi fare l'aggiornamento del modello, in caso contrario, findOneAndUpdate funzionerà se si desidera che il record di nuovo. –

0

prima è necessario definire schema per collezione particolare

schema utente:

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

uso in codice:

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

È possibile utilizzare findOneAndUpdate() e necessità per impostare {new: true}. È possibile controllare lo 4.0.0 release notes, in base al quale "nuovo" è il valore predefinito 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  
    }); 
); 
Problemi correlati