2012-03-12 20 views
7

He consultado algunas de las preguntas en el sitio y todavía no me he dado cuenta de lo que estoy haciendo mal. Tengo algo de código como esto:Mangosta actualización/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); 
    }); 
    }); 
}; 

No estoy seguro de lo que debería estar haciendo en el medio hay conseguirlo para actualizar la base de datos correctamente. He intentado bastantes cosas, pero no puedo deshacerme de averiguar todo lo que he intentado. Me ha tomado una gran parte de mi noche y quiero que funcione.

Esto es casi lo que quiero, me pregunto si hay alguna manera de hacer una o en las condiciones de la parte .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(){}); 
}; 

Voy a seguir jugando un poco con él.

Respuesta

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

Esto hace exactamente lo que quería, y es una línea. : D perfecto!

+5

Es posible que desee agregar algún control de errores a esa última función;) – staackuser2

0

¿Qué tal esto (no se prueba, pero debe trabajo con la última mangosta):

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

Lo probaré, lo conseguí para trabajar con .update() finalmente. No sé lo que estaba haciendo mal antes, pero funciona bien ahora. – Rob

+0

No, esto falla. Responderé con lo que finalmente llegue a trabajar. – Rob

9

Use findOneAndUpdate con la opción 'upsert' establecida en true.

+2

¿Hay alguna razón por la cual esto sea mejor (o peor) que 'Model.update()' en la respuesta aceptada? – joeytwiddle

+1

@joeytwiddle lo que yo sugeriría es que si solo desea actualizar y no recuperar el registro, entonces actualice el Modelo, de lo contrario, findOneAndUpdate funcionará si desea recuperar la grabación. –

0

primero es necesario definir el esquema de colección particular

esquema de usuario:

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

uso en código:

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

Puede utilizar findOneAndUpdate() y la necesidad para establecer {new: true}. Puede verificar el 4.0.0 release notes, según el cual "nuevo" es por defecto 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  
    }); 
);