通过聚合其他集合来填充字段
Populating a field by aggregating other collections
我有一个用户和一个评级集合。评分集合有 ratedBy
、ratedTo
和分数。
现在我想根据某些条件找到所有用户并获得他们的 ratingAvg
。所以结果看起来像下面这样:
[
{_id: 44s5dsdde4e4e55e,name:"bob", email: "bob@gmail.com", ratingAvg: 3, ...},
{_id: 3as5dsdde4e4e55e,name:"alice", email: "alice@gmail.com", ratingAvg: 4, ...}
]
我对数据库非常陌生,尤其是 MongoDB。我可以通过这样做
找到特定用户的 ratingAvg
Ratings.aggregate([
{
$match: {ratedTo: Mongoose.Types.ObjectId(userId)}
},
{
$group: {
_id: "$ratedTo",
avgRating: { $avg : "$score" }
}
}
]);
但我需要做的是让用户使用他们的字段和 ratingAvg
像上面那样计算。我能想到的是通过 Users.find({field: criteria})
分别找到用户并循环他们并使用上面的代码找到他们的评分。或者解决方案是进行查找并加入用户和评级,然后汇总它们。
一种可能的方法是使用聚合:
- $lookup 检索所有匹配的评分
- $addFields with $reduce计算总和并计数
$addFields
用$divide计算平均值
- $project 删除任何临时字段
我有一个用户和一个评级集合。评分集合有 ratedBy
、ratedTo
和分数。
现在我想根据某些条件找到所有用户并获得他们的 ratingAvg
。所以结果看起来像下面这样:
[
{_id: 44s5dsdde4e4e55e,name:"bob", email: "bob@gmail.com", ratingAvg: 3, ...},
{_id: 3as5dsdde4e4e55e,name:"alice", email: "alice@gmail.com", ratingAvg: 4, ...}
]
我对数据库非常陌生,尤其是 MongoDB。我可以通过这样做
找到特定用户的ratingAvg
Ratings.aggregate([
{
$match: {ratedTo: Mongoose.Types.ObjectId(userId)}
},
{
$group: {
_id: "$ratedTo",
avgRating: { $avg : "$score" }
}
}
]);
但我需要做的是让用户使用他们的字段和 ratingAvg
像上面那样计算。我能想到的是通过 Users.find({field: criteria})
分别找到用户并循环他们并使用上面的代码找到他们的评分。或者解决方案是进行查找并加入用户和评级,然后汇总它们。
一种可能的方法是使用聚合:
- $lookup 检索所有匹配的评分
- $addFields with $reduce计算总和并计数
$addFields
用$divide计算平均值- $project 删除任何临时字段