Mongoose Virtual Populate 4.5一对多

时间:2016-08-25 02:48:00

标签: mongodb mongoose

我正在使用Mongoose 4.5虚拟填充API,并且无法在一对多的一侧填充虚拟字段。

const FilmSchema = new Schema({
  title: String,
  slug: String,
  director: String
});

const DirectorSchema = new Schema({
  name: String,
  slug: String
});

DirectorSchema.virtual('films', {
  ref: 'Film',
  localField: 'slug',
  foreignField: 'director'
});

const Film = mongoose.model('Film', FilmSchema, 'film');
const Director = mongoose.model('Director', DirectorSchema, 'director');

Director.find({}).populate('films').exec()
  .then(data => res.send(data))
  .catch(err => console.log(err));

导演数据按预期输出,但没有提及films且没有抛出/记录任何错误。

在查询日志中,看起来Mongoose正在尝试按照我的要求行事:

Mongoose: director.find({}) { fields: undefined }
Mongoose: film.find({ director: { '$in': [ 'spielberg', 'zemeckis', 'nolan' ] } }) { fields: undefined }

我尝试了几种变体,例如:

  • ref
  • 上将type: String设置为FilmSchema.director的导演
  • ref
  • 上将FilmSchema.director设置为具有ObjectId类型的Director
  • 使用自定义slug字符串
  • 替换_id

......以及上述的各种组合。

我正在使用docs example和Valeri最近的article作为指南。

有谁看到我做错了什么?

版本:节点:6.3.0 / MongoDB:3.2.5 / Mongoose:4.5.8

2 个答案:

答案 0 :(得分:3)

vkarpov15回答GitHub问题:

  

尝试schema.options.toJSON = { virtuals: true }或设置$("form").on('submit', function(event) { event.preventDefault(); // to prevent default page reloading var dataString = $(this).serialize(); // to get the form data $.ajax({ type: "POST", url: "post_process.php", data: dataString, success: function(data){ $('form')[0].reset(); // to reset form data } }).done(function(data){ alert(data); // This will be called after the ajax executed }); }); 。将mongoose doc转换为pojo时,默认情况下不包含虚拟

答案 1 :(得分:1)

如果你设置了schema.options.toJSON = { virtuals: true }并且仍然没有看到填充的子对象,请尝试显式调用.toJSON() - 我只是console.log ging我的对象并且数据没有显示出来! DOH!

即:

const director = await Director.findOne({}).populate('films');
console.log(director);

>> { _id: 5a5f598923294f047ae2f66f, name: 'spielberg', __v: 0};

但是:

const director = await Director.findOne({}).populate('films');
console.log(director.toJSON());

>> { _id: 5a5f598923294f047ae2f66f, name: 'spielberg', __v: 0,
     films: [{_id: 5a5f598923294f047ae2f6bf, title:"ET"},{_id: 5a5f598923294f047ae2f30v, title:"Jaws"}]
     };