前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Mongoose的populate方法实现多表关联查询

使用Mongoose的populate方法实现多表关联查询

作者头像
越陌度阡
发布2020-11-26 12:34:17
3.5K0
发布2020-11-26 12:34:17
举报

MongoDB在3.2以上的版本有类似于 join 的 $lookup 聚合操作符,其实 Mongoose 有一个更强大的替代方法,叫做populate ( ),它允许你在其他集合中引用文档,实现更简洁优雅的查询操作。

以内容管理系统为例,有文章分类、文章详情、文章作者三个集合,UML图如下:

业务需求如下:查询文章信息,并显示文章的分类以及文章的作者信息,下面用 populate 来实现这个查询需求。

1. 定义文章分类的schema生成模型导出,文件名 aritcleCate.js

代码语言:javascript
复制
// 引入自定义的数据库连接文件
var mongoose=require('./db.js');
var ArticleCateSchema = new mongoose.Schema({
    title  : { 
        type: String, 
        unique: true 
    },
    descripton:String,
    addtime:{
        type:Date       
    }
});

module.exports=mongoose.model('ArticleCate',ArticleCateSchema,'articlecate');

2. 定义用户的schema生成模型导出,文件名 user.js

代码语言:javascript
复制
// 引入自定义的数据库连接文件
var mongoose = require('./db.js');
 
var UserSchema = new mongoose.Schema({
    username: {
        type: String,
        unique: true
    },
    password: String,
    name: String,
    age: Number,
    sex: String,
    tel: Number,
    status: {
        type: Number,
        default: 1
    }
});
module.exports = mongoose.model('User', UserSchema, 'user');

3. 定义文章的 schema 生成模型导出,文件名 article.js

通过给 schema 中的关联字段添加 ref 与指定的模型建立关联

代码语言:javascript
复制
// 引入自定义的数据库连接文件
var mongoose = require('./db.js');
var Schema = mongoose.Schema;

var ArticleSchema = new Schema({
    title: {
        type: String, unique: true
    },
    // 分类ID
    cid: {
        type: Schema.Types.ObjectId,
        // 引用文章分类的模型  
        ref: "ArticleCate"
    },
    // 用户ID
    author_id: {
        type: Schema.Types.ObjectId,
        // 引用 user 的模型
        ref: "User"
    },
    author_name: {
        type: String
    },
    descripton: String,
    content: String
});


module.exports = mongoose.model('Article', ArticleSchema, 'article');

4. 执行查询操作

代码语言:javascript
复制
// 注意使用 populate 需要引入用到的 model
var ArticleCateModel=require('./model/articleCate.js');
var ArticleModel=require('./model/article.js');
var UserModel=require('./model/user.js');

// 文章表、分类表关联
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);
})

通过给 populate 中传入所关联的字段与指定的集合进行关联查询,在 exec( ) 的回调方法中获取查询的结果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档