簡體   English   中英

用貓鼬更新記錄

[英]Updating a record with mongoose

我正在學習MEAN Stack應用程序,並且正在開發電視監視列表應用程序。 我在模型中沒有使用Seasons字段的情況下成功構建了api。 現在,我想添加此字段,以便用戶可以將季節和情節添加到文檔中以跟蹤他們觀看的情節。 經過反復試驗,我發現我將在mongo shell中使用該查詢來更新Episodes對象中的字段,但是我無法創建正確的語法來對路由內的貓鼬進行此操作。 有人可以在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相匹配的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)
    }
  })
})

您可以在此處看到一些mongodb數組運算符。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM