1// Comprehensive list of operations
2count()
3find()
4findOne()
5findOneAndRemove()
6findOneAndUpdate()
7insertMany()
8update()
9
10const schema = new mongoose.Schema({
11 value: Number
12});
13
14// Pre-find middleware
15schema.pre('find', ()=> {
16 this.where('title').gt(44); // this => query object
17});
18
19// Error handling middleware (Mongoose 4.5.x)
20schema.post('save', (error,doc,next) => {
21 if(error.name === 'MongoError' &&e error.code = 1000){
22 next(new Error('Dupicate Key'));
23 } else {
24 next(error);
25 }
26});
27
28// Example #1 =============================================================
29// item.model.ts (it's required to set strict:false, in order to use multiple versions of the model)
30const options = {
31 strict: false
32};
33const itemSchema = new mongoose.Schema({
34 name: String,
35 description: String,
36 category: String,
37 estvalue: Number
38},options)
39
40// routes/api.ts
41 app.put('/api/item/:id', function (req, res) {
42 itemUpdateMiddleware(req,res);
43 });
44
45// item.update-middleware.ts
46import * as mongoose from 'mongoose';
47import { Item } from './item.model';
48import { Schema } from 'mongoose';
49
50const itemUpdateMiddleware = (req,res) => {
51 let doc;
52
53 const callback = function(err){
54 if(err) return err;
55 res.sendStatus(200,doc)
56 };
57
58 // Add new field 'requiresInsurance'
59 if(req.body.estvalue >= 200){
60 const insuranceSchema: Schema = Item.schema.add({
61 requiresInsurance: {
62 type: Boolean, default: true
63 }
64 }) as any;
65
66 // extended schema x
67 const InsuredItem = mongoose.model('Item', insuranceSchema);
68
69 // check if doc already has requiresInsurance
70 if(!req.body.hasOwnProperty('requiresInsurance')) {
71 doc = new InsuredItem(req.body);
72 doc['requiresInsurance'] = true;
73 InsuredItem.findOneAndUpdate({_id: req.params.id},doc,callback);
74 } else {
75 doc = req.body;
76 doc['requiresInsurance'] = true;
77 Item.findOneAndUpdate({_id: req.params.id},doc,callback);
78 }
79 } else {
80 const insuranceSchema = Item.schema.add({
81 requiresInsurance: {
82 type: Boolean, default: false
83 }
84 }) as any;
85 // extended schema
86 const InsuredItem = mongoose.model('Item', insuranceSchema);
87 // check if doc already has requiresInsurance
88 if(req.body.hasOwnProperty('requiresInsurance')) {
89 doc = req.body;
90 doc['requiresInsurance'] = false;
91 InsuredItem.findOneAndUpdate({_id: req.params.id},doc,callback);
92 }
93 if(!req.body.hasOwnProperty('requiresInsurance')) {
94 doc = req.body;
95 Item.findOneAndUpdate({_id: req.params.id},doc,callback);
96 }
97 }
98}
99
100export { itemUpdateMiddleware }Created on 1/14/2018