1. 程式人生 > 實用技巧 >Mongoose的資料檢驗與聚合管道

Mongoose的資料檢驗與聚合管道

一、什麼是mongoose的資料檢驗

使用者通過mongoose給mongodb資料庫增加資料的時候,對資料的合法性進行的驗證

二、mongoose校驗引數

  • required:表示這個資料必須傳入
  • max:用於Number型別, 最大值
  • min:用於Number型別, 最小值
  • enum:列舉型別,要求資料必須滿足列舉值enum:['0', '1', '2']
  • match:增加的資料必須符合match(正則)的規則
  • maxlength:最大長度
  • minlength:最小長度
var mongoose = require('mongoose')

var UserSchema = mongoose.Schema({
	name: {
    	type: String,  // 指定型別
        trim: true,  // 修飾符,去除左右空格
        required: true,  // 表示必須傳入
        validate(name) {  // 自定義校驗器
        	return name.length >= 2
        }
    },
    sn: {
    	type: String,
        index: true,  // 索引
        set(val) {  // 自定義修飾符
        	return val
        },
        minlength: 10,  // 最小長度
        maxlength: 30,  // 最大長度
        match: /^sn(.*)i/  // 正則:要求必須以sn開頭,忽略大小寫
    },
    age: {
    	type: Number,
        min: 0,  // 最小值
        max: 150, // 最大值
    },
    status: {
    	type: Number,
        default: 1,  // 預設值
        enum: [0, 1, 2, 3]  // status的值必須在列舉的陣列中
    }
})

module.exports = mongoose.model('Users', UserSchema, 'users')

三、mongoose的聚合管道

1.order表關聯order_item
var OrderModel = require('./model/order')

// 查詢order表中每個訂單的商品
OrderModel.aggregate([
	{
    	$lookup: {
        	from: 'order_item',  // 表示被關聯的表
            localField: 'order_id',  // 關聯條件
            foreignField: 'order_id',
            as: 'items'  // 將查詢到的資料放入items
        }, {
        	$match: { 'all_price': { $gte: 90 } }  // 表示條件為all_price>=90
        }
    }
], (err, docs) => {
	if (err) return console.log(err)
    console.log(JSON.stringify(docs))
})
2.order_item關聯order
/* 查詢order_item找出商品名稱是酸奶的商品,對應的訂單的訂單號,以及訂單的總價 */
var OrderItemModel = require('./model/order_item')
var OrderModel = require('./model/order')
var mongoose = require('mongoose')

// 方法一:
OrderItemModel.find({'_id': '5eff4d743dd01fc7bce3b2bb'}, (err, docs) => {
	console.log(docs)
    
    var order_item = JSON.parse(JSON.stringify(docs))
    var order_id = docs[0].order_id
    
    OrderModel.find({'order_id': order_id}, (err, docs) => {
    	order_itme[0].order_info = docs[0]
        console.log(order_item)
    })
}) 

// 方法二:
// mongoose中獲取ObjectId:mongoose.Types.ObjectId
OrderItemModel.aggregate([
	{
    	$lookup: {
        	from: 'order',  // 表示被關聯的表
            localField: 'order_id',  // 關聯條件
            foreignField: 'order_id',
            as: 'order_info',  // 將查詢到的資料放入order_info
        }
    }, {
    	$match: {_id: mongoose.Types.ObjectId('5eff4d743dd01fc7bce3b2bb')}
    }
], (err, docs) => {
	console.log(JSON.stringify(docs))
})