mongoose中使用aggregate聚合管道
一、需求
订单表 - 订单对应的商品表,一个订单对应多个商品,现有如下需求:
1:根据订单号获取对应的所有商品
2:根据商品获取整个订单信息
二、准备
新建order和order_item两个model
order的model
const mongoose = require('./db')
const OrderSchema = mongoose.Schema({
"order_id": String,
"uid": Number,
"trade_no": String,
"all_price": Number,
"all_num": Number
})
module.exports = mongoose.model('Order', OrderSchema, 'order')
oreder_item的model
const mongoose = require('./db')
const OrderItemSchema = mongoose.Schema({
"order_id": String,
"title": String,
"price": Number,
"num": Number
})
module.exports = mongoose.model('OrderItem', OrderItemSchema, 'order_item')
三、案例
1.根据订单号获取所有商品
order.js
// 查找一个订单下所有商品
const OrderModel = require('./model/order')
OrderModel.aggregate([
{
$lookup:{
from: 'order_item',
localField: 'order_id',
foreignField: 'order_id',
as: 'items'
}
},
{
$match: { all_price: {$gte: 90}}
}
], (err, doc) => {
if(err) {console.log(err); return}
console.log('doc: ', JSON.stringify(doc));
})
查看结果
node order.js
2.根据商品获取整个订单信息
goods.js
// 查找某个商品对应的订单号及订单信息
const OrderItemModel = require('./model/order_item')
const OrderModel = require('./model/order')
const mongoose = require('./model/db')
// 1.第一种方法
// OrderItemModel.find({title: '酸奶'}, (err, doc) => {
// if(err) {console.log(err); return}
// const order_item = JSON.parse(JSON.stringify(doc));
// const order_id = order_item[0].order_id;
// OrderModel.find({order_id: order_id}, (err, order) => {
// if(err) {console.log(err); return}
// order_item[0].order_info = order;
// console.log('order_item: ', order_item);
// })
// })
// 2.第二种方法
OrderItemModel.aggregate([
{
$lookup: {
from: 'order',
localField: 'order_id',
foreignField: 'order_id',
as: 'order_info'
}
},
{
// 字符串转ObjectId
$match: {_id: mongoose.Types.ObjectId('600b8fd9562a50bba12c535c')}
// $match: {title: '酸奶'}
}
], (err, doc) => {
if(err) {console.log(err); return}
console.log('doc: ', JSON.stringify(doc));
})
查看结果
node goods.js
总结: 第一种方法不常用,第二种常用