mongoose 之 population 关联查询

本文分享如何通过 mongoose 的 population 实现关联表查询, population 的 api 可参考这里
本文demo源码.
1.初始化两个schema和model。

/**
 *  department schema
 **/
var departmentSchema = new Schema({
    id: String, //部门编号
    name: String //名称
});


/**
 *  employee schema
 **/
var employeeSchema = new Schema({
    id: Number, //工号
    name: String, //姓名
    sex: Number, //性别
    age: Number, //年龄
    dep: {
        type: Schema.Types.ObjectId,
        ref: 'department'
    }
});

/**
 *  model
 **/
var employee = mongodb.mongoose.model("employee", employeeSchema);
var department = mongodb.mongoose.model('department', departmentSchema);

employee 的属性 dep,对应model department. ref 表示关联 department model.
被关联的 model 的 type 必须是 ObjectId, Number, String, 和 Buffer.
2.初始化数据。

 //部门表
 db.departments.insert({"id":"1001","name":"市场部"});
 db.departments.insert({"id":"1002","name":"销售部"});
 db.departments.insert({"id":"1003","name":"行政部"});

 //职工表
 db.employees.insert({"id":"001","name":"jack","sex":1,"age":23,"dep":"593667c4ec59b38aefdc25b5"});
 db.employees.insert({"id":"002","name":"tom","sex":2,"age":23,"dep":"593667c4ec59b38aefdc25b6"});
 db.employees.insert({"id":"003","name":"kan","sex":1,"age":43,"dep":"593667c4ec59b38aefdc25b5"});
 db.employees.insert({"id":"004","name":"julis","sex":2,"age":23,"dep":"593667c4ec59b38aefdc25b7"});
 db.employees.insert({"id":"005","name":"michael","sex":1,"age":43,"dep":"593667c4ec59b38aefdc25b5"});
 db.employees.insert({"id":"006","name":"jordan","sex":1,"age":25,"dep":"593667c4ec59b38aefdc25b5"});

注意此处的数据初始化顺序。必须先初始化部门表,然后初始化员工表。
3.使用population关联查询

 employee.find({})    //查询所有的employees表中的数据,并将结果返回给populate
         .populate({ path: 'dep', select: { name: 1 } })   //上述结果集合中的dep字段用departments表中的name字段填充
         .exec(function(err, obj) {
             callback(err, obj);
         });

3.查询结果展示

渲染模版(ejs语法)及渲染语句:

res.render('list', { employeeList: obj });//obj为第三部中查询结果
<table class="table table-bordered tab-content-center">
                <thead>
                    <tr>
                        <th>职工ID</th>
                        <th>姓名</th>
                        <th>性别</th>
                        <th>年龄</th>
                        <th>部门</th>
                    </tr>
                </thead>
                <tbody>
                    <% for(var i=0; i<employeeList.length; i++) {%>  
                        <tr>
                            <td><%= employeeList[i]._doc.id %></td>
                            <td><%= employeeList[i]._doc.name %></td>
                            <td>
                            <% if(employeeList[i]._doc.sex == 1) { %>
                                男
                            <% } else { %>
                                女
                            <% } %>
                            </td>
                            <td><%= employeeList[i]._doc.age %></td>
                            <td><%= employeeList[i]._doc.dep.name %></td>
                        </tr>
                    <% } %>  
                </tbody>
            </table>

图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值