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 ...
随机推荐
- C#二进制与字符串之间的相互转换
1 /// <summary> 2 /// 将字符串转成二进制 3 /// </summary> 4 /// <param name="s">& ...
- ural 1152. False Mirrors
1152. False Mirrors Time limit: 2.0 secondMemory limit: 64 MB Background We wandered in the labyrint ...
- Origami
Origami 是一个来自 Facebook 设计团队的作品,是 Quartz Composer 的免费工具包,可在无需编程的情况下轻松实现与设计原型进行交互.
- 转:Web前端,高性能优化
高性能HTML 一.避免使用iframe iframe也叫内联frame,可将一个HTML文档嵌入另一个HTML文档中. iframe的好处是,嵌入的文档独立于父文档,通常也借此使浏览器模拟多线程.缺 ...
- jsp 将html字符串输出html标签
第一种: <% out.println("<table><tr><td></td></tr></table>&q ...
- iOS5中UIViewController的新方法
iOS5中UIViewController的新方法 前言 在苹果的 WWDC2011 大会视频的<Session 101 - What's New in Cocoa> 和<Sessi ...
- NSString 处理技巧:分割字符串
摘要 string类型是objective-c中用的最多的类型之一,有时会出现字符串中有我们不想要的字符. 如 "hello world"中的空格,或是"hello/wo ...
- 以下是关于Controller的一些Hint
在经过路由分发之后,实际的应用Controller接管用户的所有请求,并负责与用户数据的交互.CI中所有的应用控制器都应该是CI_Controller的子类(除非你扩展了CI的核心,那么你的Contr ...
- [转]Multiple outputs from T4 made easy
本文转自:http://damieng.com/blog/2009/01/22/multiple-outputs-from-t4-made-easy One of the things I wante ...
- 设计模式(Design Patterns)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...