Mongoose中关联查询populate的使用

MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Schema的引用,在查询文档时就可以使用 populate 方法通过引用 Schema 和 id 找到关联的另一个文档或文档的指定字段值。下面是一个简单的栗子:

【场景】: 通过学生ID找到学生所在的班级,对应集合: 学生students、 班级clazzs

 1 var mongoose = require(‘mongoose‘)
 2 var app = require(‘express‘)()
 3 var mongoose = require(‘mongoose‘)
 4 mongoose.connect(‘mongodb://localhost/test‘)
 5
 6 // 定义学生模式
 7 var StudentSchema = new mongoose.Schema({
 8     name: String,
 9     clazzID : {
10         type : mongoose.Schema.ObjectId,
11         ref : ‘Clazz‘    // clazz的Model名
12     }
13 })
14 // 连表查询方法
15 StudentSchema.statics = {
16     findClazzNameByStudentId:function(studentId, callback){
17             return this
18                 .findOne({_id : studentId}).populate(‘clazzID‘)  // 关联查询
19                 .exec(callback)
20         }
21 }
22
23 // 定义班级模式
24 var ClazzSchema = new mongoose.Schema({
25     clazzName: String
26 });
27
28 // 模型
29 var Student = mongoose.model(‘Student‘,StudentSchema)
30 var Clazz = mongoose.model(‘Clazz‘,ClazzSchema)
31
32 // 新建班级文档并保存
33 /*var clazz = new Clazz(
34     {
35         clazzName:‘体育9班‘
36     }
37 );
38 clazz.save(function  (argument){
39     console.log(‘true‘);
40 });
41 */
42
43 // 新建学生文档并保存
44 /*var student = new Student({
45     name : ‘马冬梅‘,
46     clazzID : ‘56e1440f508c947b0f32c16b‘  //体育3班的_id
47 })
48 student.save(function (err){
49     console.log(‘true‘);
50 })*/
51
52
53 Student.findClazzNameByStudentId(‘56e1446c64a8f59c0f866df3‘, function (err, student){
54     if(err) console.log(err);
55     console.log(student.name + " 在的班级: "+student.clazzID.clazzName);
56     /*通过studentID查询到对应的学生对象,并通过关联属性clazzID获取到对应classID的班级对象,
57     通过对象的clazzName属性返回班级名称*/
58 })
59
60 var logger = require(‘morgan‘);
61 if(‘development‘ === app.get(‘env‘)){
62     app.set(‘showStackError‘, true);          // 输出报错信息
63     app.use(logger(‘:method :url :status‘));  // 输出信息领域
64     app.locals.pretty = true;                 // 源代码格式化
65     mongoose.set(‘debug‘, true);              // 数据库报错信息
66 }

首先在数据库中插入一下几条班级的记录:

然后新建学生对象:

通过clazzID的值可以知道 马冬梅 的班级为 体育3班

运行代码,通过studentID查询 学生所在的班级, 结果如下:

时间: 2024-08-06 11:53:51

Mongoose中关联查询populate的使用的相关文章

THINKPHP 中关联查询(多表查询)

THINKPHP 中关联查询(多表查询)可以使用 table() 方法或和join方法,请看示例: 1.Table方法:定义要操作的数据表名称,可以动态改变当前操作的数据表名称,需要写数据表的全名,包含前缀,可以使用别名,例如: $Model->Table('think_user user') ->where('status>1') ->select(); $Model->table('think_blog blog,think_type type')->where('

yii2中关联查询

yii2 ActiveRecord多表关联以及多表关联搜索的实现 一个老生常谈的问题.最近通过群里的反馈,觉得很多人还是没有去理解这个问题.今天把这个问题讲明白了,看看yii2 ActiveRecord是怎么个多表关联以及如何去优化这个关联. 场景需求: 假设我们有一张用户表user和一张用户渠道表auth,两张数据表通过user.id和auth.uid进行一对一关联.现需要在user列表展示auth表的来源渠道source,且该渠道可搜索. 首先我们先通过gii生成user和auth系列相关的

oracle中关联查询、分组查询

高级查询 1.关联查询作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字//古老的写法select first_name,name from s_emp,s_dept where s_emp.dept_id = s_dept.id;//现在的写法select e.first_name,s.name from s_emp e join s_dept s on e.dept_id = s.id;语法:select 列,列,列 from 表1 join 表2on 表1外键=表2主键 案例

SSM-MyBatis-15:Mybatis中关联查询(多表操作)

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先简单提及一下关联查询的分类 1.一对多 1.1单条SQL操作的 1.2多条SQL操作的 2.多对一 2.1单条SQL操作的 2.1多条SQL操作的 3.多对多(类似一对多) 4.自关联(也有点类似一对多) 下面是具体实现,用真实代码带入进去(数据表和实体类和测试方法都给发出来,更多的要关注到xml中的使用) 我先把用到的数据库的脚本发一下,里面有测试数据,我折起来,需要使用的可以自行提取 /* SQLyo

MySQL中关联查询相关语句

-- emp和job查询 SELECT t1.`id`, t1.`ename`, t1.`salary`, t2.`jname`, t2.`descriptions` FROM emp t1,job t2,dept t3 WHERE t1.`job_id`=t2.`id`AND t3.`id`=t1.`dept_id`; -- 查询工资的等级 SELECT t1.ename,t1.`salary`,t2.`grade` FROM emp t1,salarygrade t2 WHERE t1.`s

Mongoose如何实现统计查询、关联查询

[问题]Mongoose如何实现统计查询.关联查询 发布于 4 年前  作者 a272121742  13025 次浏览 最近业务上提出一个需求,要求能做统计,我们设计的文档集,统计可能跨越的文档会比较多,想问一下,mongoose能实现统计查询和关联查询吗? 例如student文档对象有subject文档对象,subject文档对象有score属,查询所有学员的成绩.我个人的思路就是一般的解决方案,先查询所有学员,再查询所有分数,然后遍历做累加统计 StudentDao.find().sele

mybatis中的关联查询

1>在实体映射层中引入关联对象 package com.jinglin.hotelsup.model; import java.io.Serializable; public class Goodsinfo implements Serializable{ private Integer goodsid; private Integer companyid; private Integer goodstypeid; private Integer unitid; private String c

Yii2中多表关联查询(with、join、joinwith)

表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order         (id  order_name   customer_id   book_id) 图书表Book          (id  book_name    author_id) 作者表Author        (id  author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer ex

RDIFramework.NET 中多表关联查询分页实例

RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为指导思想,作为异质系统整合与互操作性.分布式应用提供了可行的解决方案. 分页非常的常见,基本任何项目都会涉及到分页,这没什么好谈的,大多数我们分页对单表的分页比较多,对多表的分页我们可以通过视图来实现,当然还有其他的方式,在这儿,我以一个实例展示下使用我们的RDIFramework.NET来实现多表