Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongoose虚拟财产在findById财产中不起作用_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript mongoose虚拟财产在findById财产中不起作用

Javascript mongoose虚拟财产在findById财产中不起作用,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有一个serviceSchema,如下所示: const serviceSchema=new mongoose.Schema( { 用户:{ 类型:mongoose.Schema.Types.ObjectId, 参考:“用户”, 要求:正确, }, 标题:{ 类型:字符串, 要求:正确, }, 说明:{ 类型:字符串, 要求:正确, }, 标签:[ { 类型:字符串, 要求:正确, }, ], 图片:{ 类型:字符串, 要求:正确, 获取:(rawImage)=>{ 返回`${config.b

我有一个
serviceSchema
,如下所示:

const serviceSchema=new mongoose.Schema(
{
用户:{
类型:mongoose.Schema.Types.ObjectId,
参考:“用户”,
要求:正确,
},
标题:{
类型:字符串,
要求:正确,
},
说明:{
类型:字符串,
要求:正确,
},
标签:[
{
类型:字符串,
要求:正确,
},
],
图片:{
类型:字符串,
要求:正确,
获取:(rawImage)=>{
返回`${config.base_url}/uploads/${rawImage}`;
},
},
},
{
时间戳:对,
toJSON:{getters:true,virtuals:true},
}
);
我定义了一个类似这样的虚拟模型:

serviceSchema.virtual(“avg_satis”).get(函数(){
Session.find({service:this.\u id,状态:“conf”},“满意度”)
.lean()
。然后((会话)=>{
设和=0;
sessions.forEach((session)=>{
总和+=会话满意度;
});
console.log(sum/sessions.length);
返回和/会话长度;
})
.catch((err)=>console.log(err));
});
当我执行这样的查询时:

const service=wait service.findById(req.params.service_id)。填充(
“用户”,
“\u id name pp”
);
console.log(service.avg_satisf);
虚拟机未定义

我还尝试过这样转换虚拟机(没有承诺):

serviceSchema.virtual(“avg_satis”).get(函数(){
Session.find({service:this.\u id,状态:“conf”},“满意度”)
.lean()
.exec((错误,会话)=>{
如果(错误){
控制台日志(err);
}
设和=0;
sessions.forEach((session)=>{
总和+=会话满意度;
});
console.log(sum/sessions.length);
返回和/会话长度;
});
});

数据库中不存在虚拟字段。这是一种速记,所以你不能查询它。 您需要的是调用
填充
,请阅读文档并使用它

如果你真的想在虚拟世界里得到承诺

serviceSchema.virtual(“avg_satis”).get(函数(){
//回信
return Session.find({service:this.\u id,状态:“conf”},“满意度”)
.lean()
。然后((会话)=>{
设和=0;
sessions.forEach((session)=>{
总和+=会话满意度;
});
console.log(sum/sessions.length);
返回和/会话长度;
})
.catch((err)=>console.log(err));
});
//外面
等待服务
在文档中还有另一种方式,比如静态或方法

----更新

已经在猫鼬文件里了

//定义一个模式
const animalSchema=新模式({name:String,type:String});
//为我们的动物模式的“方法”对象指定一个函数
animalSchema.methods.findSimilarTypes=函数(cb){
返回mongoose.model('Animal').find({type:this.type},cb);
};
所以

//定义一个模式
serviceSchema.methods.caleAvg=异步函数(){
return Session.find({service:this.\u id,状态:“conf”},“满意度”)
.lean()
。然后((会话)=>{
设和=0;
sessions.forEach((session)=>{
总和+=会话满意度;
});
console.log(sum/sessions.length);
返回和/会话长度;
}).catch((err)=>console.log(err));
};
//外线电话
const avg=wait service.caleAvg()

如果您想在mongooDB中执行此操作并将其附加到其响应中,您需要研究它们的
聚合
管道。

您可以详细说明更新您的模式plz。我应该如何更新它?不,我的意思是用更多关于模式的详细信息更新您的问题,并且在virtual getter中不返回任何内容,您真正想做什么?
virtual
不允许异步功能。@hoangdv我该如何解决这个问题?将会话架构添加到问题中