创建另一个文档时如何填充现有的Mongo文档?

时间:2019-12-12 18:25:43

标签: node.js reactjs mongodb express

我正在使用猫鼬和表达来构建用于存储技术工作单的API。我的票证模型中有一个字段引用用户ID,而我的用户模型中有一个数组字段,该数组引用该用户拥有的所有票证(按ID)。

当我创建新的票证(使用HTTP post方法)时,我希望数据库将该票证的ID自动添加到其分配的用户的票证字段中(例如SQL Join)。我无法正常工作。

我已经尝试在路由器的/ tickets POST请求中更新用户模型,但是无法真正了解如何使它工作。

这是我的代码:

// Ticket Model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Promise = require('bluebird');
const ObjectId = mongoose.Schema.Types.ObjectId;
const User = require('./user');

Promise.promisifyAll(mongoose);

const TicketSchema = new Schema({
  open: {type: Date, required: true},
  close: Date,
  description: {type: String, required: true},
  done: Boolean,
  status: String,
  repairType: {type: String, required: true},
  ticketOwner: {type: ObjectId, ref: 'User', required: true}
});

const Ticket = mongoose.model('Ticket', TicketSchema, 'tickets');

module.exports = Ticket;
// User Model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Promise = require('bluebird');
const ObjectId = mongoose.Schema.Types.ObjectId;
const Ticket = require('./ticket');

Promise.promisifyAll(mongoose);

const UserSchema = new Schema({
  firstName: {type: String, required: true},
  lastName: {type: String, required: true},
  email: {type: String, required: true},
  tickets: [{type: ObjectId, ref: 'Ticket'}]
});

const User = mongoose.model('User', UserSchema, 'users');

module.exports = User;
// Tickets Route
const express = require('express');
const router = express.Router();
const Ticket = require('../models/ticket');

router.route('/')
  // READ all tickets.
  .get(function(req, res, next) {
    Ticket.findAsync({})
    .then(function(tickets) {
      res.json(tickets);
    })
    .catch(next)
    .error(console.error);
  })
  // CREATE new ticket.
  .post(function(req, res, next) {
    let ticket = new Ticket();
    let prop;
    for (prop in req.body) {
      ticket[prop] = req.body[prop];
    }
    ticket.saveAsync()
    .then(function(ticket) {
      console.log('success');
      res.json({'status': 'success', 'ticket': ticket});
    })
    .catch(function(e) {
      console.log('fail');
      res.json({'status': 'error', 'error': e});
    })
    .error(console.error);
  });

router.route('/:id')
  // READ a single Ticket by ID
  .get(function(req, res, next) {
    Ticket.findOne({_id: req.params.id}, {})
    .populate('ticketOwner')
    .exec(function (e, ticket) {
      if (e) return console.error(e);
      res.json(ticket);
    })
  })
  // UPDATE a Ticket
  .put(function(req, res, next) {
    let ticket = {};
    let prop;
    for (prop in req.body) {
      ticket[prop] = req.body[prop];
    }
    Ticket.updateAsync({_id: req.params.id}, ticket)
    .then(function(updatedTicket) {
      return res.json({'status': 'success', 'ticket': updatedTicket})
    })
    .catch(function(e) {
      return res.status(400).json({'status': 'fail', 'error': e});
    });
  })
  // DELETE a Ticket
  .delete(function(req, res, next) {
    Ticket.findByIdAndRemoveAsync(req.params.id)
    .then(function(deletedTicket) {
      res.json({'status': 'success', 'ticket': deletedTicket});
    })
    .catch(function(e) {
      res.status(400).json({'status': 'fail', 'error': e})
    });
  });

module.exports = router;
// Users Route
const express = require('express');
const router = express.Router();
const User = require('../models/user');

router.route('/')
  // READ all users.
  .get(function(req, res, next) {
    User.findAsync({})
    .then(function(users) {
      res.json(users);
    })
    .catch(next)
    .error(console.error);
  })
  // CREATE new user.
  .post(function(req, res, next) {
    let user = new User();
    let prop;
    for (prop in req.body) {
      user[prop] = req.body[prop];
    }
    user.saveAsync()
    .then(function(user) {
      console.log('success');
      res.json({'status': 'success', 'user': user});
    })
    .catch(function(e) {
      console.log('fail');
      res.json({'status': 'error', 'error': e});
    })
    .error(console.error);
  });

router.route('/:id')
  // READ a single User by ID
  .get(function(req, res, next) {
    User.findOne({_id: req.params.id}, {})
    .populate('tickets')
    .exec(function (e, user) {
      if (e) return console.error(e);
      res.json(user);
    })
  })
  // UPDATE a User
  .put(function(req, res, next) {
    let user = {};
    let prop;
    for (prop in req.body) {
      user[prop] = req.body[prop];
    }
    User.updateAsync({_id: req.params.id}, user)
    .then(function(updatedUser) {
      return res.json({'status': 'success', 'user': updatedUser})
    })
    .catch(function(e) {
      return res.status(400).json({'status': 'fail', 'error': e});
    });
  })
  // DELETE a User
  .delete(function(req, res, next) {
    User.findByIdAndRemoveAsync(req.params.id)
    .then(function(deletedUser) {
      res.json({'status': 'success', 'user': deletedUser});
    })
    .catch(function(e) {
      res.status(400).json({'status': 'fail', 'error': e})
    });
  });

module.exports = router;

0 个答案:

没有答案