天天看点

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

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

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

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

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

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

// 引入自定义的数据库连接文件
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

// 引入自定义的数据库连接文件
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 与指定的模型建立关联

// 引入自定义的数据库连接文件
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. 执行查询操作

// 注意使用 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( ) 的回调方法中获取查询的结果。