记录Mongodb的populate

	Mongodb是文档型数据库,不存在像关系型数据库一样的外键设置,但通过Mongodb中的populate函数可以模拟关系型数据库的外键连接后的查询功能。
文档型数据库存储自由,不像关系型数据库在插入数据等时需要严格按照表的结构,而文档型数据库即可随意的增添属性列等。但文档型数据库在处理表间关联时较麻烦,而population就是Mongoose封装的用于在展示查询结果的视图时填充被关联的表的相关字段(前提是该字段已设置了关联其他表,且满足类型等条件,下面会讲)。

使用学生表,课程表,选课表记录对Mongodb中populate函数的理解


//引入mongoose模块,用于在nodejs端操作Mongodb数据库
var mongoose = require('mongoose'); //设置连接,其中mongdb是使用Mongodb数据库需要的协议,在IP:port/后填入的是数据库名称
mongoose.connect('mongodb://localhost:27017/test');
var db = mongoose.connection; //监听数据库的连接状态
db.on('open',function() {
console.log('数据库连接成功');
}); db.on('error',function(){
console.log('数据库连接失败');
}); // 引入Schema来定义数据库中表的结构
var Schema = mongoose.Schema; // 设置学生表的表结构
var studentSchema = new Scheam({
sno:String,
sname:String
},{
// Mongodb中有自带的_v和_id字段,设置versionKey为false将不增添_v字段
versionKey:false
}); // 使用mongoose.model实例出表数据的构造函数,后续的表的元祖将根据此构造函数实例对象
var Student = mongoose.model('Student',studentSchema); // 定义课程表的结构
var courseSchema = new Scheam({
cno:String,
cname:String,
},{
versionKey:false
}); // 定义课程表的的构造函数
var Course = mongoose.model('Course', courseSchema); // 定义选课表的表的数据结构
var scSchema = new Scheam({
sno:{type:Scheam.Types.ObjectId,ref:'Student'},
con:{type:Scheam.Types.ObjectId,ref:'Course'},
},{
versionKey:false
});
var SC = mongoose.model('SC', scSchema);

  在这里需要注意的就是在设置表间关联时,关联字段的类型(type)和引用(ref)需要在定义表的结构(定义某张表的Schema时就声明好)

  在Mongodb中使用类似外键的功能需要将要关联的表的类型设置为Scheam.Types.ObjectId类型。例如在SC表中的sno和cno属性是使用Student表中的sno属性列,Course表中的cno属性列。想要做到表间关联需要设置表字段的类型为Schema.Types.ObjectId类型,这点与关系型数据库相类似,关系型数据库中表间关联需要存放的别的表的主键字段,根据主键可以唯一的查询出数据库中的数据。而Mongodb中_id字段是数据库自有的,且每个元祖的_id不同,相当于主键功能,可用于唯一的查询数据,故表间关联需要设置关联字段的类型为type。

  ref设置了关联字段中引用的是哪张表,注意设置的是被引用表的mongoose.model中的第一个参数,设置了这个才能使用populate函数查询出关联的依赖项

在nodejs中操作Mongodb的增删改查

简单例子,文件目录结构如下:

	var express = require('express');
var app = express(); // 引用
var StudentTable = require('./database').StudentTable;
var CourseTable = require('./database').CourseTable;
var SCTable = require('./database').SCTable; var student = new StudentTable({
sname:'黄猫',
sage:30,
sgender:1
});
student.save(); var course = new CourseTable({
cname:'大数据',
cteacher:'嘿嘿'
});
course.save(); StudentTable.find({sname:'白猫'},function (err, students) {
if (!err) {
CourseTable.find({cname:'Html5'},function (err,courses) {
var sc = new SCTable({
sno:students[0]._id,
cno:courses[0]._id
});
sc.save()
});
}
});

通过修改上述student,course内容存入多条数据,在可视化工具Robo 3T中可以查看到如下:

1.StudentTable中

2.CourseTable中

	// 填充sc(选课表)设置第一条选课记录为Student表的第一个学生选取了Course表的第一个课程,注意这里填充的都是id
StudentTable.find({sname:'白猫'},function (err, students) {
if (!err) {
CourseTable.find({cname:'Html5'},function (err,courses) {
var sc = new SCTable({
sno:students[0]._id,
cno:courses[0]._id
});
sc.save()
});
}
});

3.SCTable中

4.查询出表间关联字段


SCTable.find()
// 填充sc表的sno,cno字段,执行populate的前提是这两个字段在设置表的结构(Schema)时已经设置好类型和引用的表名
.populate('sno cno','-_id')
.exec(function (err, data) {
if (!err) {
// 这里输出全部的数据
console.log(data);
for (var i = 0; i < data.length; i++) {
console.log(data[i].sno.sname);
console.log(data[i].sno.sage);
console.log(data[i].cno.cname);
console.log(data[i].cno.cteacher);
}
}
});

终端输出如下:

关于populate函数参数

Query.populate(path, [select], [model], [match], [options]) 语法

para1:(path)必填参数,指定要填充的表的字段,注意指定的是前面查询的表的字段,多个字段间使用空格隔开

para2:(select)可选参数,不写时默认填充的是被关联表的所有字段,可填入String或Object类型

String类型时‘sname -_id’ ‘-’表示不填入该字段

Object类型时{sname:1, _id:0} 1表示填充,0表示不填充

后续几个参数基本用不到

mongodb相关 (population)的更多相关文章

  1. Mongodb相关 (Shell命令 / mongoose)

    Mongodb相关 1.创建一个文件夹作为数据库存放的目录 2.打开cmd cd到Mongodb/bin目录去 3.执行mongod --dbpath "第一项创建的文件夹(数据库数据存放目 ...

  2. MongoDB相关资料

    MongoDB的介绍及安装参考http://www.cnblogs.com/lipan/archive/2011/03/08/1966463.html 安装过程: 第一步:下载安装包:官方下载地址←单 ...

  3. MongoDB相关资料收集

    MongoDB 入门教程http://www.runoob.com/mongodb/mongodb-tutorial.html .net 驱动程序下载:http://mongodb.github.io ...

  4. MongoDB 相关下载

    MongoDB 下载:http://www.mongodb.org/ 本实例中MongoDB的C#驱动,支持linq:https://github.com/samus/mongodb-csharp M ...

  5. 【原】Mongodb相关资料

    Mongodb与关系型数据库对比 Mongodb与关系型数据库对比 由于之前主要接触的是关系型数据库,所以主要将Mongodb与关系型数据库进行对比:主要从术语.Server与Client.数据定义语 ...

  6. Mongodb 相关链接

    http://www.cnblogs.com/lanceyan/tag/mongodb/

  7. mongodb相关文章

    1.Windows 平台安装 MongoDB 2.MONGODB基本命令用 3.MongoDB 教程

  8. MongoDB相关记录

    win10中zip安装 下载地址:http://dl.mongodb.org/dl/win32/x86_64 首先解压至某文件夹, 使用管理员权限打开cmd或者powershell, 进入指定目录中的 ...

  9. MongoDB相关操作

    1.  连接MongoDB <?php //1.连接到MongoDB $host = "127.0.0.1"; $port = 27017; $server = " ...

随机推荐

  1. DOM编程从入门到忘记

    文档对象模型(Document Object Model,DOM)是使用 W3C 定义的 API (Application Program Interface) 来操作 HTML 文档 (此处不局限于 ...

  2. pyparsing:定制自己的解析器

    在工作中,经常需要解析不同类型的文件,常用的可能就是正则表达式了,简单点的,可能会使用awk.这里要推荐一种比较小众的方式,使用pyparsing来解析文件. pyparsing可以做些什么呢?主要可 ...

  3. tp5框架的获取器

    tp5的获取器功能很强大,一下子就喜欢上了,你可以在模块里任意定义表里不存在的字段,在前台调用很方便.话不多说直接上demo: 1.命名规则   get + 属性名的驼峰命名+ Attr 直接就能在m ...

  4. 逆波兰表达式的C实现

    复习下数据结构,用栈简单实现逆波兰表达式,参考文档: http://www.nowamagic.net/librarys/veda/detail/2307 http://www.nowamagic.n ...

  5. vijos1057题解

    题目: 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这 ...

  6. jQuery教程详解(一)

    PS--了解JQuery Query是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库( 或JavaScript框架).jQuery设计的宗旨 ...

  7. 【Stack Overflow -- 原创加工、原创整理、生产实战】-- 深度复制

    一.说明 1.本程序的核心代码不是我原创的,是我在Stack Overflow上搜集后加工出来的,原作者已忘记了~ 2.这段程序是我在上海携程(2014年左右)上班时整理并在生产环境应用的,先后经历了 ...

  8. JAVA实用案例之水印开发

    写在最前面 上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考. Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上 ...

  9. Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)

    Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...

  10. LoadRunner压力测试之Unique Number参数类型、Random Number参数类型浅析

    前几天工作需要用LoadRunner进行压力测试,期间对手机号进行参数化设置. 当时选用了<Value>137{Random_quhao}{Unique_weiyi}</Value& ...