node.js - nodejs - npm node js
ActualizaciĆ³n de un registro con mangosta (1)
Estoy aprendiendo MEAN aplicaciones de pila y estoy trabajando en una aplicación de lista de reproducción de TV. Construí la API con éxito sin el campo seasons en el modelo. Ahora me gustaría agregar este campo para que un usuario pueda agregar temporadas y episodios al documento para hacer un seguimiento de los episodios que ha visto. A través del método de prueba y error encontré la consulta que usaría en el shell mongo para actualizar un campo en el objeto de episodios pero no puedo crear la sintaxis correcta para hacer esto con mangosta dentro de mi ruta. ¿Alguien puede mirar en mis rutas tele.js en el router.put y decirme qué pasa?
Modelos (TVSeries.js)
var mongoose = require(''mongoose'')
var Schema = mongoose.Schema
var tvSchema = new Schema({
title:String,
poster:String,
rated:String,
program_time:Number,
network:String,
airs_on:[],
streams_on:[],
genre:[],
seasons:[
season_number:Number,
episodes:[
{
episode_number:Number,
title:String,
watched:Boolean
}
]
]
}, {collection: ''tvShows''});
module.exports = mongoose.model(''tv'', tvSchema);
Rutas (tele.js)
var express = require(''express'');
var router = express.Router();
var TV = require(''../models/TVSeries.js'');
/* GET home page. */
router.get(''/'', function(req, res, next) {
res.render(''index'', { title: ''Your Watchlist'' });
});
router.get(''/api/shows/:id/seasons'', function(req, res){
TV.findById(req.params.id, ''seasons'', function(err, data){
if(err){console.log(err)}
else{res.json(data)};
});
});
router.put(''/api/shows/:id/seasons/:sid'', function(req, res){
var setField = {
seasons:[
{
season_number:req.params.sid,
episodes:[
req.body
]
}
]
}
TV.findOneAndUpdate({"_id":req.params.id}, setField, {upsert:true}, function(err, results){
if(err){console.log(err)}
else{
console.log(setField);
res.json(results)
}
})
})
module.exports = router;
Comando Mongo Shell
db.tvShows.update({"_id":ObjectId(''######################'')},{$set: {''seasons.1.episodes.1.title'':''This is my title change''}})
Puede usar &elementMatch
para buscar la temporada &elementMatch
en la matriz, y en el objeto setField puede usar el operador $
posicional que identifica el elemento coincidente en la consulta.
El problema es que si no encuentra ninguna temporada que coincida con season_number
, el documento no se actualizará. En este caso, puede establecer otra consulta de actualización para agregar esta temporada en la matriz de seasons
.
router.put(''/api/shows/:id/seasons/:sid'', function(req, res){
var query = {
"_id": req.params.id,
"seasons": {
$elemMatch: {
"season_number": req.params.sid
}
}
}
var setField = {
$addToSet: {
"seasons.$.episodes": req.body
}
}
TV.findOneAndUpdate(query, setField, {upsert:true}, function(err, results){
if (err && err.code == 16836) { // no document was matched
var season = {
"season_number": req.params.sid
"episodes": [ req.body]
}
TV.findOneAndUpdate({"_id": req.params.id}, {$push: {"seasons": season}} , function(err, result) {
console.log("Inserted document in array");
res.json(result)
});
}
else if (err){
console.log(err);
res.status(500).send(''Something wrong!'');
}
else {
console.log(setField);
res.json(results)
}
})
})
Aquí puede ver algunos operadores de arreglos de mongodb.
Espero eso ayude.