8.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

总结: 第一种方法不常用,第二种常用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值