- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MongoDB多表关联查询操作实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了MongoDB多表关联查询操作。分享给大家供大家参考,具体如下:
Mongoose的多表关联查询 。
首先,我们回忆一下,MySQL多表关联查询的语句:
student表:
calss表:
通过student的classId关联进行查询学生名称,班级的数据:
SELECT student.name,student.age,class.name FROM student,class WHERE student.classId = class.id 。
Mongoose多表联合查询(还是以众所周知的学生、班级作为实例) 。
· 表结构的定义(schemas目录下) 。
1. student表(student.js) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
var
mongoose = require(
'mongoose'
);
var
Schema = mongoose.Schema;
/*定义数据模式*/
var
StudentSchema =
new
mongoose.Schema({
name: String,
calssId: {
type: Schema.Types.objectId,
ref:
'class'
},
age: Number,
number: Number,
meta: {
createAt: {
type: Date,
default
: Date.now()
},
updateAt: {
type: Date,
default
: Date.now()
}
}
/*更新时间的*/
});
module.exports = StudentSchema;
|
2. class表(class.js) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
var
mongoose = require(
'mongoose'
);
var
Schema = mongoose.Schema;
/*定义数据模式*/
var
ClassSchema =
new
mongoose.Schema({
name: String,
meta: {
createAt: {
type: Date,
default
: Date.now()
},
updateAt: {
type: Date,
default
: Date.now()
}
}
/*更新时间的*/
});
module.exports = ClassSchema;
|
· 生成Model(model目录下) 。
1. student Model(student.js) 。
1
2
3
4
5
6
|
var
mongoose = require(
'mongoose'
);
var
StudentSchema = require(
'../schemas/student'
);
/*通过model编译模式为模型*/
var
Student = mongoose.model(
'student'
, StudentSchema);
/*导出Student模型 模块*/
module.exports = Student;
|
2. class Model(class.js) 。
1
2
3
4
5
6
|
var
mongoose = require(
'mongoose'
);
var
ClassSchema = require(
'../schemas/class'
);
/*通过model编译模式为模型*/
var
Class = mongoose.model(
'class'
, ClassSchema);
/*导出Class模型 模块*/
module.exports = Class;
|
· Model进行数据的查询操作 。
1. 将静态类的方法加到Model的编译中 。
1
2
3
4
5
6
7
|
StudentSchema.static = {
fetch:
function
(cb){
return
this
.find({})
.sort(
'meta.updateAt'
)
//按更新的时间排序
}
}
|
2. 将静态类方法加到Model中 。
1
2
3
4
5
|
StudentSchema.static(
'fetch'
,
function
(cb){
return
this
.find({}, cb)
.sort(
'meta.updateAt'
)
})
|
3. 直接调用model的find()方法 。
查询的结果均为:
[ { _id: '5a05222f583e5720b8660191', name: '张三', age: 18, number: 11, classId: '5a0036512b740f32e4371e66' }, { _id: '5a05222f583e5720b8660091', name: '李四', age: 19, number: 11, classId: '5a0036512b740f32e1371e66' }, { _id: '5a05222f583e5720b18660191', name: '赵五', age: 17, number: 11, classId: '5a0036512b7420f32e4371e66' } ] 。
· 多表联合查询(学生对应班级) 。
1
2
3
4
5
6
7
8
9
|
StudentSchema.static = {
findStudentWithClass:
function
(cb) {
return
this
.find({})
.populate(
'classId'
)
//注意这是联合查询的关键
.sort(
'meta.updateAt'
)
.exec(cb)
}
}
|
查询结果:
[ { _id: '5a05222f583e5720b8660191', name: '张三', age: 18, number: 11, classId: { _id: '5a0036512b740f32e4371e66', name: '一年1班' } }, { _id: '5a05222f583e5720b8660091', name: '李四', age: 18, number: 11, classId: { _id: '5a0036512b740f32e1371e66', name: '二年2班' } }, { _id: '5a05222f583e5720b18660191', name: '赵五', age: 18, number: 11, classId: { _id: '5a0036512b7420f32e4371e66', name: '一年2班' } } ] 。
· 由上面的实例可知,mongoose的多表联合查询的关键:
1. 数据模式结构定义需要利用关键字ref定义关联 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var
Schema =
new
mongoose.Schema({
field: {
type: mongoose.Schema.Type.ObjectId,
ref:
'model'
}
});
Schema.static = {
fetch:
function
(cb){
return
this
.find({})
.populate(
'field'
)
.exec(cb)
}
}
var
Model = mongoose.Model(
'model'
,Schema );
|
希望本文所述对大家MongoDB数据库程序设计有所帮助.
原文链接:https://blog.csdn.net/WaterSprite_ct/article/details/78500997 。
最后此篇关于MongoDB多表关联查询操作实例详解的文章就讲到这里了,如果你想了解更多关于MongoDB多表关联查询操作实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!