我正在使用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
答案 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"}]
};