24.mongoose聚合管道

1.aggregate

1.定义schema

  • model/order.js
var OrderSchema = mongoose.Schema({
	order_id: String,
	uid: Number,
	trade_no: String,
	all_price: Number,
	all_num: Number
})

var OrderItemSchema = mongoose.Schema({
	order_id: String,
	title: String,
	price: Number,
	num: Number
})

2.定义model

  • model/order.js
var OrderModel = mongoose.model('Order',  OrderSchema, 'order')
var OrderItemModel = mongoose.model('OrderItem ',  OrderItemSchema, 'order_item')

3.聚合查询

  • order表关联order_item
  • app.js
OrderModel.aggregate([
  {
    $lookup: {
      from: "order_item",
      localField: "order_id",
      foreignField: "order_id",
      as: "items"
    }
  }
], function(err, docs){
  if(err){
    console.log(err);
    return;
  }
  console.log(docs);
})
  • order_item表关联order
OrderItemModel.aggregate([
  {
    $lookup: {
      from: "order",
      localField: "order_id",
      foreignField: "order_id",
      as: "order"
    }
  }
], function(err, docs){
  if(err){
    console.log(err);
    return;
  }
  console.log(docs);
})

4.mongoose中获取id

$match: {_id: mongoose.Types.ObjectId("xxxxxxxxxxx")}

5.多表联查

OrderModel.aggregate([
  {
    $lookup: {
      from: "order_item",
      localField: "order_id",
      foreignField: "order_id",
      as: "items"
    },
    {
	  $lookup: {
      from: "xxx",
      localField: "order_id",
      foreignField: "xxx_id",
      as: "xxx"
	}
  }
], function(err, docs){
  if(err){
    console.log(err);
    return;
  }
  console.log(docs);
})

2.populate

  • 一种更强大的关联查询方法

在这里插入图片描述

1.定义Schema

var Schema = mongoose.Schema;
var ArticleSchema = new Schema({
	title: {
		type: String,
	},
	cid: {
		type: Schema.Types.ObjectId,
		ref: "ArticleCateModel"  // articlecate表对应的模型名
	},
	author_id: {
		type: Schema.Types.ObjectId,
		ref: "UserModel"  // articlecate表对应的模型名
	},
	author_name: {
		type: String
	},
	description: String,
	content: String
})

2.查询

  • 通过article,查询关联集合userarticlecate
// 文章表和分类表
ArticleModel.find({}).populate('cid').exec(function(err, docs){
	console.log(docs);
})

// 文章表和分类表、用户表
ArticleModel.find({}).populate('cid').populate('author_id').exec(function(err, docs){
	console.log(docs);
})

版权声明:本文为qq_42517220原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。