文件内容

导入数据

db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2}) db.order.insert({"order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2}) db.order.insert({"order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6}) db.order_item.insert({"order_id":"1","title":"商品鼠标 1","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 2","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 3","price":0,num:1}) db.order_item.insert({"order_id":"2","title":"牛奶","price":50,num:1}) db.order_item.insert({"order_id":"2","title":"酸奶","price":40,num:1}) db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,num:5}) db.order_item.insert({"order_id":"3","title":"毛巾","price":10,num:1})

db.js

var mongoose = require('mongoose'); mongoose.connect('mongodb://eggadmin:123456@127.0.0.1:27017/eggcms',{ useNewUrlParser: true },function(err){     if(err){         console.log(err)         return     }     console.log("数据库连接成功") })  module.exports = mongoose;

order.js

var mongoose = require('./db.js'); var OrderSchema = mongoose.Schema({     order_id:{         type:String,     },     uid:Number,     trade_no:String,     all_price:Number,     all_num:Number, })  var OrderSchema = mongoose.model('Order',OrderSchema,'order'); module.exports = OrderSchema 

order_item.js

var mongoose = require('./db.js'); var OrderItemSchema = mongoose.Schema({     order_id:{         type:String,     },     title:String,     price:Number,     num:Number, })  var OrderItemSchema = mongoose.model('OrderItem',OrderItemSchema,'order_item'); module.exports = OrderItemSchema 

关联查询

app.js

 var OrderModel = require('./order.js'); OrderModel.aggregate([{     $lookup:{         from:"order_item",         localField:"order_id",         foreignField:"order_id",         as:"item"     } }],function(err,docs){     if(err){         console.log(err);         return;     }     console.log(JSON.stringify(docs)) })


$project 修改文档的结构

可以用来重命名,增加或者删除文档中的字段

要求查找 order 只返回文档中 trade_no 和 all_price 字段

app.js

OrderModel.aggregate([ {     $project:{         trade_no:1,         all_price:1     } } ], function (err, docs) {     if (err) {         console.log(err);         return;     }     console.log(docs) })


$match,筛选

得到总价格>90的数据

app.js

var OrderModel = require('./order.js'); var OrderItemModel = require('./order_item.js'); OrderModel.aggregate([{     $lookup: {         from: "order_item",         localField: "order_id",         foreignField: "order_id",         as: "item"     }, }, {     $match: {         "all_price": {             $gte: 90         }     } }], function (err, docs) {     if (err) {         console.log(err);         return;     }     // console.log(docs)     console.log(JSON.stringify(docs)) })

$group

将集合中的文档进行分组,可用于统计结果。

统计每个订单的订单数量,按照订单号分组

app.js

OrderItemModel.aggregate([{     $group:{         _id:"$order_id",         total:{$sum:"$sum"}     } }],function (err, docs) {     if (err) {         console.log(err);         return;     }     // console.log(docs)     console.log(JSON.stringify(docs)) })


$sort 排序

1为升序,-1为降序

app.js

OrderModel.aggregate([ {     $project:{         trade_no:1,         all_price:1     } }, {     $sort:{"all_price":1} } ], function (err, docs) {     if (err) {         console.log(err);         return;     }     console.log(docs) })


$limit 限制

只查一条

app.js

OrderModel.aggregate([ {     $project:{         trade_no:1,         all_price:1     } },  {     $sort:{"all_price":1} }, {     $limit:1 } ], function (err, docs) {     if (err) {         console.log(err);         return;     }     console.log(docs) })


$skip 跳过

app.js

OrderModel.aggregate([ {     $project:{         trade_no:1,         all_price:1     } },  {     $sort:{"all_price":1} }, {     $skip:1 } ], function (err, docs) {     if (err) {         console.log(err);         return;     }     console.log(docs) })


根据order_item,查询order的信息

查询order_item,找出商品名称是酸奶的商品,酸奶这个商品对应的订单的订单号和订单总价格等信息


第一种方式

app.js

var OrderModel = require('./order.js'); var OrderItemModel = require('./order_item.js'); OrderItemModel.find({     "_id": "5bffa9bbd8cb3dff1d3d6658" }, function (err, docs) {     var order_item = JSON.parse(JSON.stringify(docs));     var order_id = order_item[0].order_id;      OrderModel.find({         "order_id": order_id     }, function (err, order) {         order_item.order_info = order[0];         console.log(order_item)     }) })


第二种方式

app.js

var OrderItemModel = require('./order_item.js'); var mongoose = require("mongoose") OrderItemModel.aggregate([{     $lookup: {         from: 'order',         localField: "order_id",         foreignField: "order_id",         as: "order_info"     } }, {     $match: {         "_id":mongoose.Types.ObjectId('5bffa9bbd8cb3dff1d3d6658')     } }], function (err, docs) {     if (err) {         console.log(err);         return;     }     console.log(JSON.stringify(docs)) })