2011-08-12 9 views
8

He mirado a través de la API de mangosta, y muchas preguntas sobre SO y en el grupo de Google, y todavía no puede encontrar la actualización de documentos incrustados.¿Cómo actualizar el documento incrustado en mangosta?

estoy tratando de actualizar esta userListings objeto particular con el contenido de argumentos.

for (var i = 0; i < req.user.userListings.length; i++) { 
    if (req.user.userListings[i].listingId == req.params.listingId) { 
     User.update({ 
      _id: req.user._id, 
      'userListings._id': req.user.userListings[i]._id 
     }, { 
      'userListings.isRead': args.isRead, 
      'userListings.isFavorite': args.isFavorite, 
      'userListings.isArchived': args.isArchived 
     }, function(err, user) { 
      res.send(user); 
     }); 
    } 
} 

Éstos son los esquemas:

var userListingSchema = new mongoose.Schema({ 
    listingId: ObjectId, 
    isRead: { 
     type: Boolean, 
     default: true 
    }, 
    isFavorite: { 
     type: Boolean, 
     default: false 
    }, 
    isArchived: { 
     type: Boolean, 
     default: false 
    } 
}); 

var userSchema = new mongoose.Schema({ 
    userListings: [userListingSchema] 
}); 

Esto también encontrar que no funciona, que es probablemente el primer número:

User.find({ 
    '_id': req.user._id, 
    'userListings._id': req.user.userListings[i]._id 
}, function(err, user) { 
    console.log(err ? err : user); 
}); 

que devuelve:

{ stack: [Getter/Setter], 
    arguments: [ 'path', undefined ], 
    type: 'non_object_property_call', 
    message: [Getter/Setter] } 

Eso debería ser equivalente a th es llamada del cliente mongo:

db.users.find({'userListings._id': ObjectId("4e44850101fde3a3f3000002"), _id: ObjectId("4e4483912bb87f8ef2000212")}) 

de reproducción:

mongoose v1.8.1 
mongoose-auth v0.0.11 
node v0.4.10 

Respuesta

6

cuando ya tiene el usuario, sólo se puede hacer algo como esto:

var listing = req.user.userListings.id(req.params.listingId); 

listing.isRead = args.isRead; 
listing.isFavorite = args.isFavorite; 
listing.isArchived = args.isArchived; 

req.user.save(function (err) { 
    // ... 
}); 

como se encuentra aquí: http://mongoosejs.com/docs/subdocs.html

Finding a sub-document

Each document has an _id. DocumentArrays have a special id method for looking up a document by its _id.

var doc = parent.children.id(id); 

* * advertencia * *

como @zach señaló que debe declarar el esquema del sub-documento antes del esquema del documento real para poder usar el id() método.

+2

que estoy recibiendo "TypeError: Object [object Object], [object Object], [object Object], [object Object] no tiene un método 'id '" – FrederickCook

+0

¿Es eso un problema de automango? Ahí es donde se asigna req.user. – FrederickCook

+0

the mongoose docu dice: "DocumentArrays tiene una identificación de método especial que filtra sus documentos incrustados por su propiedad _id (cada documento incrustado obtiene uno)". pero no lo he intentado yo mismo. – pkyeck

0

Se trata sólo de una falta de coincidencia en los nombres de las variables?

Tiene user.userListings[i].listingId en el bucle for pero user.userListings[i]._id en el find.

¿Está buscando una listingId o _id?

0

usted tiene que salvar el objeto padre, y markModified el documento anidada.

Esa es la forma en que lo hacemos

exports.update = function(req, res) { 
    if(req.body._id) { delete req.body._id; } 
    Profile.findById(req.params.id, function (err, profile) { 
    if (err) { return handleError(res, err); } 
    if(!profile) { return res.send(404); } 
    var updated = _.merge(profile, req.body); 
    updated.markModified('NestedObj'); 
    updated.save(function (err) { 
     if (err) { return handleError(res, err); } 
     return res.json(200, profile); 
    }); 
    }); 
}; 
Cuestiones relacionadas