如何在mongodb的子文档模式结构中更新数组字段

How to update array field in subdocumented schema structure in mongodb

本文关键字:结构 更新 数组 字段 模式 文档 mongodb      更新时间:2023-09-26

TaskInfo Schema:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var taskInfo = mongoose.Schema({
     isactive:{type:Boolean}, 
     taskobject:{type:String}, 
     taskdetails:{type:String}, 
     iscompleted:{type:Boolean}
    });

    var TaskInfo = mongoose.model('TaskInfo', taskInfo);
    module.exports.TaskInfo = TaskInfo;
    module.exports.TaskInfoSchema = taskInfo;

TaskSchema:

var mongoose = require('mongoose');
var TaskInfoSchema = require("./taskinfo.js").TaskInfoSchema
var Schema = mongoose.Schema;
// Task schema
var taskSchema = mongoose.Schema({
 tasktype  : {type: String},
 createdon : {type: Date, default: Date.now},
 //createdby : {type: Schema.Types.ObjectId,ref: 'User'},
 //visitedby : [{type: Schema.Types.ObjectId,ref: 'User'}],
 taskinfo  : [TaskInfoSchema]  
});
module.exports = mongoose.model('Task', taskSchema); 

这是routefile/controller:

var TaskInfo = require('../models/taskinfo.js').TaskInfo;
var Task = require('../models/task.js');
var config = require('../../config');
module.exports = function (app, express) {
    var api = express.Router();
    //GET method is for fetching all the tasks from the database,
    api.get('/taskdb', function (req, res) {
        //console.log("____");
        Task.find({}, function (err, taskdb) {
            if (err) {
                res.send(err);
                return;
            }
            res.json(taskdb);
        });
    });

    //POST method is for saving all the tasks to the database,
    api.post('/tasks', function (req, res) {
        var task = {};
        task.tasktype = req.body.tasktype;
        task.taskinfo = [];
        for (var i = 0; i < req.body.taskInfo.length; i++) {
            console.log(i);
            var taskInfo = new TaskInfo(req.body.taskInfo[i]);
            task.taskinfo.push(taskInfo);
        }
        var taskObj = new Task(task);
        taskObj.save(function (err) {
            if (err) {
                res.send(err);
                return;
            }
            res.json({
                message: 'Task has been created'
            })
        });
    });

    return api
}

我正在尝试添加REST api来更新每次面对错误的值,有人请告诉我数组是如何更新的,请建议我一些好的资源,如果你发现它太基本,不应该在这里问。

下面是我的代码更新操作:

api.use('/tasks/:taskId',function(req, res, next){
      Task.findById(req.params.taskId, function(err, task){
        if(err){
           res.send(err);
        return;
               }
        else if(task)
        {
          req.task = task;
          next();
        }
        else
        {
        res.status(404).send ('no task found with such details');
        }
        });
    });

api.patch ('/tasks/:taskId',function(req,res){
  if(req.body._id)
    delete req.body._id;
  for(var p in req.body)
      {
        req.tasktype[p] = req.body[p];
      }
  for(var p in req.body)
      {
        req.taskInfo[p] = req.body[p];
      }
  req.taskobj.save(function(err){
        if(err){
           res.send(err);
        return;
        }
       res.json({message:'Task edited & updated '})
    });
});

您可以使用$set operator

更新文档

1)如果要基于子文档id

更新子文档
var id = taskInfoId;
here i  am going to update field "isactive" of particular taskinfo
    Task.update({"taskinfo._id":id},{$set:{"isactive":true}},function(err,success){
    if(err){
    }else{
    }
    });

2)如果要根据父文档id更新子文档,则

var taskId = taskId;
   Task.update({"_id":taskId},{$set:{"isactive":true}},function(err,success){
    if(err){
    }else{
    }
    });