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

注意问题:

    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/

posted on 2017-04-27 19:42  猫不白  阅读(330)  评论(0编辑  收藏  举报

导航