Mongoose中关联查询populate的使用
MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Schema的引用,在查询文档时就可以使用 populate 方法通过引用 Schema 和 id 找到关联的另一个文档或文档的指定字段值。下面是一个简单的栗子:
【场景】: 通过学生ID找到学生所在的班级,对应集合: 学生students、 班级clazzs
var mongoose = require('mongoose')
var app = require('express')()
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test')
// 定义学生模式
var StudentSchema = new mongoose.Schema({
name: String,
clazzID : {
type : mongoose.Schema.ObjectId,
ref : 'Clazz' // clazz的Model名
}
})
// 连表查询方法
StudentSchema.statics = {
findClazzNameByStudentId:function(studentId, callback){
return this
.findOne({_id : studentId}).populate('clazzID') // 关联查询
.exec(callback)
}
}
// 定义班级模式
var ClazzSchema = new mongoose.Schema({
clazzName: String
});
// 模型
var Student = mongoose.model('Student',StudentSchema)
var Clazz = mongoose.model('Clazz',ClazzSchema)
// 新建班级文档并保存
/*var clazz = new Clazz(
{
clazzName:'体育9班'
}
);
clazz.save(function (argument){
console.log('true');
});
*/
// 新建学生文档并保存
/*var student = new Student({
name : '马冬梅',
clazzID : '56e1440f508c947b0f32c16b' //体育3班的_id
})
student.save(function (err){
console.log('true');
})*/
Student.findClazzNameByStudentId('56e1446c64a8f59c0f866df3', function (err, student){
if(err) console.log(err);
console.log(student.name + " 在的班级: "+student.clazzID.clazzName);
/*通过studentID查询到对应的学生对象,并通过关联属性clazzID获取到对应classID的班级对象,
通过对象的clazzName属性返回班级名称*/
})
var logger = require('morgan');
if('development' === app.get('env')){
app.set('showStackError', true); // 输出报错信息
app.use(logger(':method :url :status')); // 输出信息领域
app.locals.pretty = true; // 源代码格式化
mongoose.set('debug', true); // 数据库报错信息
}
首先在数据库中插入一下几条班级的记录:

然后新建学生对象:

通过clazzID的值可以知道 马冬梅 的班级为 体育3班
运行代码,通过studentID查询 学生所在的班级, 结果如下:

Mongoose中关联查询populate的使用的更多相关文章
- THINKPHP 中关联查询(多表查询)
THINKPHP 中关联查询(多表查询)可以使用 table() 方法或和join方法,请看示例: 1.Table方法:定义要操作的数据表名称,可以动态改变当前操作的数据表名称,需要写数据表的全名,包 ...
- mongoose的关联查询 :populate
mongoose关联查询从3.2版本开始支持 基本用法如下: var studentSchema = new Schema({ name:String, age:String, school:{ ty ...
- SSM-MyBatis-15:Mybatis中关联查询(多表操作)
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先简单提及一下关联查询的分类 1.一对多 1.1单条SQL操作的 1.2多条SQL操作的 2.多对一 2.1单 ...
- yii2中关联查询
yii2 ActiveRecord多表关联以及多表关联搜索的实现 一个老生常谈的问题.最近通过群里的反馈,觉得很多人还是没有去理解这个问题.今天把这个问题讲明白了,看看yii2 ActiveRecor ...
- wcf+linq to sql中关联查询返回数据问题
前段时间准备采用wcf+nh框架开发sl程序,发现采用nh开发不适合我的中型.并且快速开发项目,所以综合考量了下,决定采用wcf+linq to sql . 但是此模式也有缺点,也是linq to s ...
- python&django 实现页面中关联查询小功能(中级篇)
目的 组合搜索实现如下图功能 知识点 1.使用自定义标签模板(templatetags) 实现 models.py 和 views.py和初级篇一样 重点如下:在app01目录下创建templatet ...
- python&django 实现页面中关联查询小功能(基础篇)
效果 实现效果图如下,根据过滤条件查询相关信息. 知识点 1.配置URL,在路由中使用正则表达式 2.过滤查询 代码 setting.py from django.contrib import adm ...
- tp5 模型中 关联查询(省去了foreach写法)
1.控制器中 $list = Userlawsbook::where($where)->with('lawsbook')->paginate(7); // 此处查出来为数组对象 dump ...
- Mongoose中的关联表查询 && 聚合查询
注:阅读此篇文章,需要有一定的Mongo基础.基本的不会再重复介绍. 例: 有两张表,一张是博客列表,另外一张是博客的标签表.现在我们要做两张表的插入和关联查询. 创建两张表的Schema 主表bl ...
随机推荐
- ural 1155. Troubleduons
1155. Troubleduons Time limit: 0.5 secondMemory limit: 64 MB Archangel of the Science is reporting:“ ...
- 如何在 .Net Framework 4.0 项目上使用 OData?
最新的 Microsoft ASP.NET Web API 2.1 OData 5.1.0 已只能在 .Net Framework 4.5 的安装了,如果要在 VS2010的 .Net Framewo ...
- BZOJ4311 : 向量
考虑离线操作,求出每个向量存在的时间区间,用时间线段树来进行分治,在每个节点求出凸壳后,询问时在凸壳上三分答案.时间复杂度$O(n\log^2n)$. #include<cstdio> # ...
- 一个spring jdbc实例
一.使用示例 (1)springJdbcContext.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- 【POJ】A New Stone Game(博弈论)
http://poj.org/problem?id=1740 题目大意就是,对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分 ...
- 关于Ruby的一些知识
1 -9/2 = -5 当进行一个除法运算的结果是一个负数的时候,由于Ruby采取向负无穷大圆整,所以结果是-5.而由于除数是个整数,所以结果也是一个整数.而其他语言多数是向0取整. 2 连接字符串建 ...
- CentOS 下实现两台服务器之间的共享NFS
NFS的安装配置:centos 5 :yum install nfs-utils portmapcentos 6 :yum install nfs-utils rpcbind yum install ...
- 关于Stock Quant与生产内容的理解
Stock Quant对象是8.0中新增加的内容,主要用于核算库存,与Stock Move相关联,没个Stock Move动作都会关联一个或者多个Stock Quant对象.库存移动的过程实际上就是将 ...
- 紧挨导航栏下的链接a标签失效
在我编完网页测试的的时候,发现导航下的链接不能用,不出现小手的图表,而下面的相同的链接都能用.如下图所示 遇到的相同问题的另一个未完成的页面如图 先不谈论其原因,说一下我对第一个页面的解决办法,我在导 ...
- php读取3389脚本
<?php $regkey = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Td ...