Javascript 虚拟猫鼬

Javascript 虚拟猫鼬,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我尝试在我创建的两个模型之间使用虚拟填充: 在本例中,您可以使用巡演id获取所有评论,并在巡演中显示它们。 (使用query findById()仅显示此巡更时) 我的虚拟在模式中被设置为true(在使用虚拟填充后,我尝试将它们设置为true,但不起作用-通过这个) 在检查mongoose文档后,它似乎是正确的,但不起作用 我的模式: const tourSchema=new mongoose.Schema({ 姓名:{ 类型:字符串, 必需:[true,'巡更必须有名称'],//验证程序 独

我尝试在我创建的两个模型之间使用虚拟填充: 在本例中,您可以使用巡演id获取所有评论,并在巡演中显示它们。 (使用query findById()仅显示此巡更时)

我的虚拟在模式中被设置为true(在使用虚拟填充后,我尝试将它们设置为true,但不起作用-通过这个)

在检查mongoose文档后,它似乎是正确的,但不起作用

我的模式:

const tourSchema=new mongoose.Schema({
姓名:{
类型:字符串,
必需:[true,'巡更必须有名称'],//验证程序
独一无二:没错,
特里姆:没错,
maxlength:[40,'巡更名称必须少于或等于40个字符'],
minlength:[10,'巡演名称必须至少包含10个字符']
//validate:[validator.isAlpha,'巡更名称只能包含字母字符']
},
等
等
等
//指南:数组---用户id的| |嵌入数组
指南:[
//引用用户数据模型,而不将指南保存在巡更数据模型中
//子引用
{
类型:mongoose.Schema.ObjectId,
参考:“用户”
}
]
},
{
//传递选项,将虚拟属性获取到文档/对象
toJSON:{virtuals:true},
toObject:{virtuals:true}
}
);
//定义虚拟属性
tourSchema.virtual('durationWeeks').get(函数(){
console.log('virtual1');
//使用函数声明=>使用此关键字
返回此文件。持续时间/7;
});
//虚拟填充
tourSchema.virtual('reviews'{
参考:“审查”,
localField:“\u id”,//查找“localField”所在的巡更`
foreignField:'tour',//等于'foreignField'`
//在查看中的tour字段中查找tour的_id

});您需要将选项
virtuals:true
传递到模式创建中:

const tourSchema = new mongoose.Schema({
    ...
}, {
  virtuals: true
}
此外,我们使用
mongoose lean virtuals
模块帮助实现.lean和virtuals。e、 g

const mongooseLeanVirtuals = require('mongoose-lean-virtuals');
...
tourSchema.plugin(mongooseLeanVirtuals);
tourSchema.set('toJSON', { virtuals: true });
tourSchema.set('toObject', { virtuals: true });

虽然我猜这并不是绝对必要的。

您需要一个选项
virtuals:true
传递到模式创建中:

const tourSchema = new mongoose.Schema({
    ...
}, {
  virtuals: true
}
此外,我们使用
mongoose lean virtuals
模块帮助实现.lean和virtuals。e、 g

const mongooseLeanVirtuals = require('mongoose-lean-virtuals');
...
tourSchema.plugin(mongooseLeanVirtuals);
tourSchema.set('toJSON', { virtuals: true });
tourSchema.set('toObject', { virtuals: true });
虽然我猜这并不是绝对必要的。

所以我想出来了。 首先,我在github-mongoose回购中询问,并得到了回答:

reviewSchema.pre(/^find/, function (next) {
    this.populate({
        path: 'tour',
        options: { select: 'name' } // <-- wrap `select` in `options` here...
    }).populate({
        path: 'user',
        options: { select: 'name photo' } // <-- and here
    });

    next();
});
在tour模型中,我将外键从“tour_id”(正如我在其他问题中看到的那样)更改为“tour”)

现在,我的巡演数据中确实有评论,它确实通过id虚拟填充到巡演中,所以我找到了答案。 首先,我在github-mongoose回购中询问,并得到了回答:

reviewSchema.pre(/^find/, function (next) {
    this.populate({
        path: 'tour',
        options: { select: 'name' } // <-- wrap `select` in `options` here...
    }).populate({
        path: 'user',
        options: { select: 'name photo' } // <-- and here
    });

    next();
});
在tour模型中,我将外键从“tour_id”(正如我在其他问题中看到的那样)更改为“tour”)


现在,我的巡更数据中确实有评论,它确实通过id虚拟填充巡更

嘿,这不起作用,在我的tourSchema中,正如您在定义模型后看到的那样,将virtuals设置为true。另外,我更新了问题并发布了JSON,我得到了回复。在reviewSchema中,我获得了tour的id,但在tour对象的arr中,我可能没有正确地填充以获得id?嘿,这不起作用,在我的tourSchema中,正如您在定义模型后看到的那样,将virtuals设置为true。另外,我更新了问题并发布了JSON,我得到了回复。在reviewSchema中,我获得了巡更的id,但是在巡更对象的arr中,我可能没有正确地填充以获得id?