0

我正在编写一个跟踪成员及其认证的应用程序。每个成员都有一些引用其他模型的数组,如Mongoose 人口文档中所述。

Member图式

{
  name: {
    first: String,
    last: String
  },
  unit: Number,

  // more stuff

  class_year: Number,
  campus_box: String,
  campus_address: String,

  // more stuff

  emails: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Email' }],
  certifications: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Certification' }],
  service_credits: [{ type: mongoose.Schema.Types.ObjectId, ref: 'ServiceCredit' }]
}

Certification图式

{
  type: String,
  issue: Date,
  expiry: Date,
  number: String,
  _member: { type: mongoose.Schema.Types.ObjectId, ref: 'Member' }
}

Email和的模式ServiceCredit相似,因为它们都具有_member字段。

当我创建一个Email时,它被添加到Email模型中,然后我可以执行

var Email = mongoose.model('Email');
Email.findOne().populate('_member').exec(function (err, email) {
  console.log(email._member.name.first);
});

但是,它没有添加到Member架构中的数组中,因为当我运行时

var Member = mongoose.model('Member');
Member.findOne().populate('emails').exec(function (err, member) {
  res.json(200, member);
});

emails: []当显然Email与该成员相关联时,我会进入 JSON。

我已经阅读了需要填充文档本身的 Mongoose API,因此我正在尝试使用以下内容执行http://mongoosejs.com/docs/api.html#document_Document-populate中引用的内容:

var Member = mongoose.model('Member');
Member.findOne({ _id: req.session.member._id }, function (err, member) {
  member.populate('emails', function (err) {
    console.log('populated emails');
  });
});

但我得到错误:(member's JSON data) has no method 'populate'。我知道我试图populate在错误的事情上运行,但我无法弄清楚正确的方法是什么。

4

1 回答 1

0

我还遇到了填充数组的问题,您定义的架构将为每个数组元素创建一个子文档(尝试转储数组)。

尝试将架构更改为:

emails: [ type: mongoose.Schema.Types.ObjectId ]

并使用

Member.findOne().populate({ path: 'emails', model: 'Email' }).exec(function (err, member) {
    res.json(200, member);
});

填充数组。

于 2013-08-05T05:30:19.587 回答