mongoose populate
mongoose具备关系数据库一样的关联查询,通过在schema模型中设置ref属性,然后在查询时使用populate关键字,可以达到关联查询的目的。
以下内容参考了mongoose官方文档http://mongoosejs.com/docs/2.7.x/docs/populate.html ,代码也由该文档而来。
先上代码:
//schema
var mongoose = require('mongoose');var mydb =mongoose.connect('mongodb://localhost/test');
var Schema=mongoose.Schema;
var PersonSchema = new Schema({
name : String
, age : Number
, stories : [{ type: Schema.ObjectId, ref: 'Story' }]
});
var StorySchema = new Schema({
_creator : { type: Schema.ObjectId, ref: 'Person' }
, title : String
, fans : [{ type: Schema.ObjectId, ref: 'Person' }]
});
var Story = mongoose.model('Story', StorySchema);
var Person = mongoose.model('Person', PersonSchema);
module.exports = {
Story,
Person};
//testcode
var debug = require('debug')('dev:news');
var Story = require('../models/pop.js').Story;
var Person = require('../models/pop.js').Person;
var aaron = new Person({name: 'Aaron', age: 100});
aaron.save(function (err) {
if (err) throw err;var story1 = new Story({
title: "A man who cooked Nintendo"
, _creator: aaron._id
});
aaron.stories.push(story1);
aaron.save(function (err) {
story1.save(function (err) {
if (err) throw err;
Person.findOne({name: "Aaron"}).populate('stories')
.exec(function (err, person) {
if (err) throw err;
console.log("person =", person);
console.log("person.stories =", person.stories[0]);
})
Story.findOne({title: /Nintendo/i}).populate('_creator')
.exec(function (err, story) {
if (err) throw err;
console.log("story creator=", story._creator.name);
})
});
});
});
注意问题:
- 如果不使用
aaron.stories.push(story1);将ref象压入,Person对象查询story将返回空值。
但是官网里面不推荐使用这种方法,原因是对象之间的互相引用有可能在数据库中不同步,但当引用唯一时,可以避免这个问题。所以,不论是需要查询引用对象(parent)还是被引用对象(children)的参数时,都通过children来查询。
- 如果只需要查询关联对象的部分属性参数,可以使用在populate中指定参数的方式,如
populate('_creator', ['name'])
其他参考
https://gist.github.com/hastebrot/1170907
https://alexanderzeitler.com/articles/mongoose-referencing-schema-in-properties-and-arrays/
mongoose populate的更多相关文章
- nodejs mongoose populate 多层模型
参考地址:http://ronaldroe.com/populating-multiple-fields-and-levels-with-mongoose/ 文字版本 Mongoose, the po ...
- Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose
参考:博客 https://www.cnblogs.com/chentianwei/p/10268346.html 参考: mongoose官网(https://mongoosejs.com/docs ...
- MongoDB学习day10--Mongoose的populate实现关联查询
一.Mongoose populate官方文档 https://mongoosejs.com/docs/populate.html 二.Mongoose populate关联查询 1.定义ref va ...
- MongoDB——待整理
MongoDB mongoose——http://mongoosejs.com/ npm i mongoose Mongoose 通过外键与另一张表建立关联:Mongoose Populate 基本使 ...
- Node-Blog整套前后端学习记录
Node-Blog 后端使用node写的一个一整套的博客系统 #### 主要功能 登录 注册 发表文章 编辑/删除文章 添加/删除/编辑文章分类 账号的管理 评论功能 ... 所用技术 node ex ...
- 在Mongoose中使用嵌套的populate处理数据
假设有如下mongodb的schema定义: drawApply = new Schema({ salesId: { type: Schema.ObjectId, ref: 'sales' }, mo ...
- Mongoose中关联查询populate的使用
MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Sc ...
- mongoose的关联查询 :populate
mongoose关联查询从3.2版本开始支持 基本用法如下: var studentSchema = new Schema({ name:String, age:String, school:{ ty ...
- mongoose的populate的使用方法;
LotteryReceiveRecord.find({"lottery":req.params.id}).populate("user lottery").ex ...
随机推荐
- mac下CSV文件用FileReader、FileWriter读写乱码
先说下windows的excel文件搬到mac下打开为什么会显示乱码. 在win下,excel采用GBK编码,1个汉字是存为2个字节,而mac下各种软件广泛默认使用UTF-8编码方式,如在e ...
- js继承之原型链方式实现
温故而知新: 在之前的文章已经重点了解了原型对象,今天就理一理这个原型对象在原型链式的继承中的使用 function a(x,y){this.x=x;this.y=y;} //定义一个函数,当构造函数 ...
- STM32学习笔记(一)——点亮一个LED
引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...
- vue获取dom元素内容
通过ref来获取dom元素 在vue官网上对ref的解释 ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 D ...
- kafka环境
二.环境搭建 参考:http://kafka.apache.org/documentation.html#quickstartStep 1: 下载Kafkawget http://mirrors.no ...
- servlet:从入门到实战学习(1)---全·环境配置
最近公司忙加班学习,学校忙助教工作,博客鸽了好久,后端学习工作过程中学了好多东西,趁着工作之余得空补补博客,算是整理下学习的东西. javaweb的后端研发需要学习的是tomcat+servlet+j ...
- stm32中的延时函数
//粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ; } } //毫秒级的 ...
- ASP.Net零碎
ASP.Net零碎 ServerPush 什么是ServerPush,服务器向客户端浏览器“推送”,其实就是“长连接”. 只有浏览器请求服务器端,服务器端才有给浏览器响应数据,不会主动向浏览器推送数据 ...
- 深入解析MySQL视图view
阅读目录---深入解析MySQL视图view 创建视图 查看视图 视图的更改 create or replace view alter DML drop 使用with check option约束 嵌 ...
- 详解Session分布式共享(.NET CORE版)
一.前言&回顾 在上篇文章Session分布式共享 = Session + Redis + Nginx中,好多同学留言问了我好多问题,其中印象深刻的有:nginx挂了怎么办?采用Redis的S ...