Mongoose使用population建立关系链接实例说明

引用文档:

基于Node.js项目实践,构建可扩展的web应用(当当书籍地址)

Mongoose 使用之 Population

Mongoose API v4.4.13 .
版本信息:"express": "~4.13.1","mongoose":"4.3.6"

MongoDB、Mongoose

MongoDB是NoSQL数据库,易扩展,比传统数据库更适合处理大数据。Mongoose是基于Node.js、MongoDB的高级ORM类库。链接数据库简单,不必每次开启关闭数据库。对于NoSql数据库来说,数据库中是不存储关系数据的,并没有主键、外键约束之分,但是我们可以在应用层进行存储,Mongoose提供的这一特性,名为population,允许我们使用不同集合来填充文档特定部分,个人理解感觉就像是通过外键可以获得外键所在表中的信息这样的查询效果。

在介绍population之前,先简单介绍一下Mongoose的一些名词:

Schema:一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力。

Model:由Schema发布生成的模型,具有抽象性和行为的数据库操作对。

实例说明:

首先引入mongoose模块,连接数据库

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');

链接数据库之后要定义原型,原型是一个json格式的类,Mongoose的原型支持下面这些数据类型:

  • String
  • Number
  • Boolean
  • Buffer:node.js二进制类型,多用于图像、PDF、档案等;
  • Date:ISO标准格式化日期类型;
  • Array
  • Schema.Types.ObjectId:MongoDB中的一个典型24个字符,12字节的十六进制数字字符串;
  • Schema.Type.Mixed:任何类型数据。

建立的实例场景为一个聊天室中可以有多名用户。

建立用户原型:

var UserSchema = Schema({
  _id:Number,
  name : String,
  sex:String
})
var User = mongoose.model('users', UserSchema);//将原型和方法编译为一个模块,users也将是存入数据库中的集合的名称。

建立聊天室原型:

var RoomSchema = Schema({
  roomNumber:String,
  roomMember:[{
    type:Number, ref: 'users'
  }],
})
var Room = mongoose.model('rooms',RoomSchema);//将原型和方法编译为一个模块

创建实例:

var lily = new User({'_id':1000,'name': 'lily','sex':'F'});
var lucy = new User({'_id':1001,'name':'lucy','sex':'F'});
var room = new Room({
  'roomNumber':'1',
  'roomMember':[lily._id,lucy._id]//此处所调用的必须为_id字段,如果创建原型时未创建id字段,则数据库会自动生成Schema.Types.ObjectId类型的_id
});

将数据存入数据库:

function callback(err,doc){
  if(err) throw err;
  console.log(doc);//返回的是存入数据库中的记录
};
lily.save(callback);
lucy.save(callback);
room.save(callback);

数据库中查询记录

数据库中的查询记录

population的使用
在查找数据的而过程中使用population可以输出相应的实例记录

Room.findOne({roomNumber:'1'})
.populate('roomMember')
.exec(callback);

通过population查询之后,在控制台中打印的console.log(doc)如下图所示:


通过图片我们可以看到在room原型中所ref的user原型中符合的信息已经全部都输出了,这样就不用多集合查询获得信息了,虽然各集合之间都没有关系,但是我们通过使用population在应用层存储它们,太感人了!
Demo地址:https://github.com/a67c/populateDemo

出现的错误提示及原因

 E11000 duplicate key error index: populateDemo.users.$_id_ dup key: { : 1000 }

出现了重复的键,由于用户的_id是手动插入的,而非系统自动生成的ObjectedId(),所以如果再插入_id:1000,就会报此类错误。

Cast to ObjectId failed for value "XXX" at path "_id".

调用的参考值不是_id,按照例子来说就是在实例化时'roomMember':[lily._id,lucy._id]调用一定要是_id字段!
小扩展

1、当我不需要获得一条记录的全部信息时可以在populate中对于输出的信息做限制

Room.findOne({roomNumber: '1'})
.populate('roomMember','name')
.exec(callback);

在populate中添加User中的字段name,那么在输出的过程中就会只显示name和_id字段。

ps:错误之处还请指出,多多指教
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容