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 ...
随机推荐
- 学习面向对象编程OOP 第一天
面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...
- 自动生成数学题型二(框架struts2)题型如((a+b)*c=d)
1. 生成题目 1.1 生成单个题目 public static String[] twoOperatorAndOperator(int num1, int num2) { double first ...
- sql中常见日期获取
获取当前年月日 --获取当前月份 ,GETDATE())) --获取当前月份的下个月 ,GETDATE())) --获取当前月份的上个月 year()获取年 select year(GETDATE() ...
- 手机QQ无法临时会话的解决方案
手机网页发起临时会话: <a href="mqqwpa://im/chat?chat_type=wpa&uin=3355135984&version=1& ...
- Android学习探索之运用MVP设计模式实现项目解耦
前言: 一直致力于提高开发效率降低项目耦合,今天想抽空学习一下MVP架构设计模式,学习一下如何运用到项目中. MVP架构设计模式 MVP模式是一种架构设计模式,也是一种经典的界面模式.MVP中的M代表 ...
- 【从无到有】JavaScript新手教程——1.简介、变量和运算符
今天带大家来学习一下在网页制作过程中很常用的JavaScript(简称JS). 一.JS的作用: 表单验证,减轻服务端的压力 添加页面动画效果 动态更改页面内容 Ajax网络请求 二.[使用JS的 ...
- redis 主从配置实例、注意事项、及备份方式
这两天在配置线上使用的redis服务.总得看起来,redis服务的配置文件还是非常简洁.清楚,配置起来非常顺畅,赞一下作者. 下面是我使用的配置,使用主从模式,在master上关掉所有持久化,在sla ...
- windows10 配置 华为vpn客户端
2017-05-08 1. 安装客户端软件VPNClient_V100R001C02SPC703.exe 2. 新建vpn 安装完成后,打开客户端连接vpn,发现未启用虚拟网卡(这是因为还需要安装客户 ...
- DokiCam 360°4K相机:为极致运动爱好者而生
去年11月,位于中国苏州的DokiCam为其360°消费像机推出了Kickstarter人群资助活动.随着本次活动圆满结束,这款被称为DokiCam 360°的动作相机现在已经可以购买. 进入360° ...
- vue.js 初体验— Chrome 插件开发实录
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:陈纬杰 背景 对于经常和动画开发打交道的开发者对于Animate.css这个动画库不会陌生,它把一些常见 ...