【发布时间】:2017-03-12 20:54:39
【问题描述】:
我正在学习 MEAN 堆栈应用程序,并且正在开发一个电视监视列表应用程序。我在模型中没有季节字段的情况下成功构建了 api。现在我想添加这个字段,以便用户可以将季节和剧集添加到文档中,以跟踪他们观看过的剧集。通过反复试验,我找到了我将在 mongo shell 中使用来更新剧集对象中的字段的查询,但我无法创建正确的语法来在我的路由中使用 mongoose 执行此操作。有人可以在 router.put 上查看我的 tele.js 路由并告诉我出了什么问题。
模型 (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);
路线(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;
Mongo Shell 命令
db.tvShows.update({"_id":ObjectId('######################')},{$set: {'seasons.1.episodes.1.title':'This is my title change'}})
【问题讨论】:
-
仍在努力寻找解决方案。尝试了更接近的 findOneAndUpdate。我现在可以更新剧集对象,但不仅仅是将另一个对象添加到数组中,而是删除所有其他对象并将其替换为 req.body。有谁知道这个问题的解决方案吗?
标签: node.js mongodb express mongoose crud