Mongodb 在使用mongoose-aggregate-paginate-v2时,如何使用子文档中的数组聚合、填充、排序和获取项目的平均值?

Mongodb 在使用mongoose-aggregate-paginate-v2时,如何使用子文档中的数组聚合、填充、排序和获取项目的平均值?,mongodb,pagination,average,lookup,aggregation,Mongodb,Pagination,Average,Lookup,Aggregation,嗨,我正在为星级评定系统写一些代码 从较高的层次上讲,我希望获得的是一个用户的总体平均星级分数和一个“星级条目”的平均星级分数 “星型条目”可以由“n”个星型定义组成(参见下面的模式),并且应该具有这些定义的平均值,例如: date: 10 Jan 2020 communication - 3 stars attire - 3 stars *average 3 stars* date: 6 Jan 2020 communication - 2 stars attire - 1 stars *

嗨,我正在为星级评定系统写一些代码

从较高的层次上讲,我希望获得的是一个用户的总体平均星级分数和一个“星级条目”的平均星级分数

“星型条目”可以由“n”个星型定义组成(参见下面的模式),并且应该具有这些定义的平均值,例如:

date: 10 Jan 2020
communication - 3 stars
attire - 3 stars
*average 3 stars*

date: 6 Jan 2020
communication - 2 stars
attire - 1 stars
*average 1.5 stars*
10 Jan 2020 - 3 stars
6 Jan 2020 - 2 stars
*average 2.5 stars*
总平均星级分数是通过计算所有“星级条目”的平均值来计算的,例如:

date: 10 Jan 2020
communication - 3 stars
attire - 3 stars
*average 3 stars*

date: 6 Jan 2020
communication - 2 stars
attire - 1 stars
*average 1.5 stars*
10 Jan 2020 - 3 stars
6 Jan 2020 - 2 stars
*average 2.5 stars*
我还想有条目分页和排序的日期(最后在顶部) 我不反对运行两个查询,一个是获取“总平均值”和用户ID,第二个是获取每个条目的“平均星级”和分页信息

使用星型模式

const mongoose=require('mongoose');
const Schema=mongoose.Schema;
const mongooseAggregatePaginate=require('mongoose-aggregate-paginate-v2');
const UserStarSchema=新架构({
userId:{type:Schema.Types.ObjectId,必需:true},
userIdGiver:{type:Schema.Types.ObjectId,必需:true},
dateCreated:{type:Date,必需:true,默认值:Date.now},
starsArray:[
{
starDefinitionId:{type:Schema.Types.ObjectId,必需:true,ref:'stardefinitions'},
星号:{type:Number,必需:true,默认值:0},
},
],
});
plugin(mongooseAggregatePaginate);
module.exports=UserStar=mongoose.model('userStars',UserStarSchema);
下面是UserStar模式的一组数据示例:

{
  "_id": "5f4d2e4a72112b46a0beddfc",
  "userId": "5f490bed6a04684204a4502e",
  "userIdGiver": "5f48f9209b714c2caccf1b89",
  "starsArray": [
    {
      "stars": "0.5",
      "_id": "5f4d2e4a72112b46a0beddfd",
      "starDefinitionId": "5f4d207ae93051293ce82cae"
    },
    {
      "stars": "5",
      "_id": "5f4d2e4a72112b46a0beddfe",
      "starDefinitionId": "5f4d2067e93051293ce82cad"
    }
  ],
  "dateCreated": "1598893642758"
}
stardefinitionschema

const mongoose=require('mongoose');
const Schema=mongoose.Schema;
const StarDefinitionSchema=新架构({
类别:{type:String,必需:true},
定义:{type:String,必需:true},
});
module.exports=StarDefinition=mongoose.model('stardefinitions',StarDefinitionSchema);
以下是stardefinition模式的一个示例:

{
“_id”:“5f4d2067e93051293ce82cad”,
“类别”:“服装”,
“定义”:“他们穿得好吗?”
}
预期产出

请注意,starDefinitionId由StarDefinition中的所有数据填充

{
“用户ID”:“5f490bed6a04684204a4502e”,
“平均”:2.25,
“文件”:[
{
“_id”:“5f4d33dfe5171d3de4e861ab”,
“用户ID给定者”:“5f48f9209b714c2caccf1b89”,
“平均”:2,
“starsArray”:[
{
"明星":一,,
“_id”:“5f4d33dfe5171d3de4e861ac”,
“starDefinitionId”:{
“_id”:“5f4d207ae93051293ce82cae”,
“类别”:“通信”,
“定义”:“他们沟通得如何?”,
“_v”:0
}
},
{
"明星":3,,
“_id”:“5f4d33dfe5171d3de4e861ad”,
“starDefinitionId”:{
“_id”:“5f4d2067e93051293ce82cad”,
“类别”:“服装”,
“定义”:“他们穿得好吗?”,
“_v”:0
}
}
],
“dateCreated”:“2020-08-31T17:31:11.081Z”,
“_v”:0,
“stardefinitionsIndex”:空
},
{
“_id”:“5f4d2f0f4d041239e4aa2a2c”,
“用户ID给定者”:“5f48f9209b714c2caccf1b89”,
“平均”:2.5,
“starsArray”:[
{
"明星":3,,
“_id”:“5f4d2f0f4d041239e4aa2a2d”,
“starDefinitionId”:{
“_id”:“5f4d207ae93051293ce82cae”,
“类别”:“通信”,
“定义”:“他们沟通得如何?”,
“_v”:0
}
},
{
"明星":二,,
“_id”:“5f4d2f0f4d041239e4aa2a2e”,
“starDefinitionId”:{
“_id”:“5f4d2067e93051293ce82cad”,
“类别”:“服装”,
“定义”:“他们穿得好吗?”,
“_v”:0
}
}
],
“dateCreated”:“2020-08-31T17:10:39.125Z”,
“_v”:0,
“stardefinitionsIndex”:空
}
],
“totalDocs”:4,
"限额":二,,
“页码”:1,
“总页数”:2,
“分页计数器”:1,
“hasPrevPage”:错误,
“hasNextPage”:正确,
“prevPage”:空,
“下一页”:2
}
以下是我目前正在使用的内容:

第1版

var id=mongoose.Types.ObjectId(userId);
var agg_匹配={
$match:{userId:id},
};
变量agg_查找={
$lookup:{
来自:“用户之星”,
localField:'starsArray.starDefinitionId',
foreignField:“\u id”,
如:'星定义',
},
};
var agg_unwind={
$REWIND:{
路径:“$stardefinitions”,
preserveNullAndEmptyArrays:对,
IncludeAryIndex:“stardefinitionsIndex”,
},
};
var agg_sort={
$sort:{
创建日期:-1,
},
};
var agg=[agg_匹配、agg_查找、agg_展开、agg_排序];
var pageAndLimit={
第页:第页,
极限:极限,
};
var myAggregate=UserStar.aggregate(agg);
如果(调试此){
log('aggregation',JSON.stringify(agg));
log('page和limit',JSON.stringify(pageAndLimit));
}
var entry=await UserStar.aggregatePaginate(myAggregate、pageAndLimit);
我有分页和限制工作(使用mongoose-aggregate-paginate-v2)

输入

userId=“5f490bed6a04684204a4502e”
第页=0
极限=2
版本