用猫鼬更新记录
Updating a record with mongoose
我正在学习 MEAN 堆栈应用程序,并且正在开发电视观看列表应用程序。我在模型中没有季节字段的情况下成功构建了 api。现在我想添加此字段,以便用户可以将剧季和剧集添加到文档中以跟踪他们观看过的剧集。通过反复试验,我发现我将在 mongo shell 中使用查询来更新剧集对象中的字段,但我无法创建正确的语法来使用 mongo 执行此操作在我的路线内。谁能看看我在 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'}})
您可以使用 &elementMatch
在数组中找到想要的季节,并且在 setField 对象中您可以使用位置 $
运算符来标识查询中匹配的元素。
问题是,如果找不到与 season_number
匹配的任何季节,则不会更新文档。在这种情况下,您可以设置另一个更新查询以将这个季节添加到 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)
}
})
})
您可以看到 here 一些 mongodb 数组运算符。
希望对您有所帮助。
我正在学习 MEAN 堆栈应用程序,并且正在开发电视观看列表应用程序。我在模型中没有季节字段的情况下成功构建了 api。现在我想添加此字段,以便用户可以将剧季和剧集添加到文档中以跟踪他们观看过的剧集。通过反复试验,我发现我将在 mongo shell 中使用查询来更新剧集对象中的字段,但我无法创建正确的语法来使用 mongo 执行此操作在我的路线内。谁能看看我在 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'}})
您可以使用 &elementMatch
在数组中找到想要的季节,并且在 setField 对象中您可以使用位置 $
运算符来标识查询中匹配的元素。
问题是,如果找不到与 season_number
匹配的任何季节,则不会更新文档。在这种情况下,您可以设置另一个更新查询以将这个季节添加到 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)
}
})
})
您可以看到 here 一些 mongodb 数组运算符。
希望对您有所帮助。