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);
            })
          });
  });
});

注意问题:

    1. 如果不使用 aaron.stories.push(story1);将ref象压入,Person对象查询story将返回空值。

      但是官网里面不推荐使用这种方法,原因是对象之间的互相引用有可能在数据库中不同步,但当引用唯一时,可以避免这个问题。所以,不论是需要查询引用对象(parent)还是被引用对象(children)的参数时,都通过children来查询。
    2. 如果只需要查询关联对象的部分属性参数,可以使用在populate中指定参数的方式,如
      populate('_creator', ['name'])

其他参考

https://gist.github.com/hastebrot/1170907

https://alexanderzeitler.com/articles/mongoose-referencing-schema-in-properties-and-arrays/

mongoose populate的更多相关文章

  1. nodejs mongoose populate 多层模型

    参考地址:http://ronaldroe.com/populating-multiple-fields-and-levels-with-mongoose/ 文字版本 Mongoose, the po ...

  2. Practical Node.js (2018版) 第7章:Boosting Node.js and Mongoose

    参考:博客 https://www.cnblogs.com/chentianwei/p/10268346.html 参考: mongoose官网(https://mongoosejs.com/docs ...

  3. MongoDB学习day10--Mongoose的populate实现关联查询

    一.Mongoose populate官方文档 https://mongoosejs.com/docs/populate.html 二.Mongoose populate关联查询 1.定义ref va ...

  4. MongoDB——待整理

    MongoDB mongoose——http://mongoosejs.com/ npm i mongoose Mongoose 通过外键与另一张表建立关联:Mongoose Populate 基本使 ...

  5. Node-Blog整套前后端学习记录

    Node-Blog 后端使用node写的一个一整套的博客系统 #### 主要功能 登录 注册 发表文章 编辑/删除文章 添加/删除/编辑文章分类 账号的管理 评论功能 ... 所用技术 node ex ...

  6. 在Mongoose中使用嵌套的populate处理数据

    假设有如下mongodb的schema定义: drawApply = new Schema({ salesId: { type: Schema.ObjectId, ref: 'sales' }, mo ...

  7. Mongoose中关联查询populate的使用

    MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Sc ...

  8. mongoose的关联查询 :populate

    mongoose关联查询从3.2版本开始支持 基本用法如下: var studentSchema = new Schema({ name:String, age:String, school:{ ty ...

  9. mongoose的populate的使用方法;

    LotteryReceiveRecord.find({"lottery":req.params.id}).populate("user lottery").ex ...

随机推荐

  1. 实现一个竖直的显示表头的表格(vue版本)

    今天遇到一个问题,实现这样一个竖直的显示表头的表格,如下图.默认显示两列. vue实现代码如下:   tableComponent.vue:   <template> <table ...

  2. 自定义一个EL函数

    自定义一个EL函数 一般就是一下几个步骤,顺便提供一个工作常用的 案例: 1.编写一个java类,并编写一个静态方法(必需是静态方法),如下所示: public class DateTag { pri ...

  3. salesforce 零基础学习(七十)使用jquery table实现树形结构模式

    项目中UI需要用到树形结构显示内容,后来尽管不需要做了,不过还是自己做着玩玩,mark一下,免得以后项目中用到. 实现树形结构在此使用的是jquery的dynatree.js.关于dynatree的使 ...

  4. Windows下JIRA6.3.6安装、汉化、破解

    一.MySQL建库和建账号 1. mysql中创建数据库jiradb create database jiradb character set 'UTF8'; 2.创建数据库用户并赋于权限 creat ...

  5. 网络语音视频技术浅议(附多个demo源码下载)

    我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮 ...

  6. druid 连接kafuk

    java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Ddruid.realtime.specFile=examples/indexing/ ...

  7. Java设计模式:生成器模式

    问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...

  8. kvc模式详解

    java利用反射机制访问类的 私有变量.OC的KVC模式也是一样,用来访问私有变量用的. 用字符串去访问对象实例变量的机制. //KVC模式-(void)KVCtest{ [_dm valueForK ...

  9. lua 条件控制

    lua 条件控制 if 语句 结构 if (condition) then statements end 示例程序 local a = 10 if (a > 1) then print(&quo ...

  10. gif-drawable的使用及详解

    下载gif-drawable包和Demo的链接:http://pan.baidu.com/s/1eQxVKRo 本帖原创,转载的朋友请注明转载地址>:http://www.cnblogs.com ...