我有两个模型:User
和 Track
。
用户
可以完成每个Track
并获得积分。
用户模式:
let userSchema = new mongoose.Schema({
name: {type: String, required: true},
completedTracks: [{
type: mongoose.Schema.ObjectId,
ref: 'Track',
}],
});
跟踪模式:
let trackSchema = new mongoose.Schema({
points: {
type: Number,
default: 0,
}
});
我在 User
模型中存储对已完成轨道的引用。
我想做的是查询多个用户,只显示他们每个人完成的轨道的 _id 并添加有关在新的 score
中得分的总分的信息> 属性(property)。
我想达到的结果示例:
[
{
"completedTracks": [
"5a9f14f18e04b3225953954c",
"5aa5a8fa7367661c03f57a99",
"5aa1aa5a7da9fd2946b01c04"
],
"name": "Person 1",
"score": 42,
"id": "5aaab2c63d1a9d182b183a01"
},
{
"completedTracks": [],
"name": "Person 2",
"score": 0,
"id": "5aaab602c5bdc411d3cef3bd"
}
]
我尝试创建可以返回分数的虚拟,但它不起作用,因为 user.completedTracks
只是 ObjectIds
userSchema.virtual('score').get(function() {
return this.completedTracks.reduce((acc, doc) => acc + doc.points, 0);
});
最佳答案
您可以在 3.4 中尝试以下聚合。
$lookup
查找已完成轨道的分数,然后是 $addFields
以返回对分数求和的分数字段和 $project
排除以从响应中删除查找数据字段。
UserModel.aggregate([
{"$lookup":{
"from":"tracks", // name of the foreign collection
"localField":"completedTracks",
"foreignField":"_id",
"as":"lookup-data"
}},
{"$addFields":{
"score":{
"$sum":"$lookup-data.points"
}
}},
{"$project":{"lookup-data":0}}
])
关于javascript - 来自填充文档的 Mongoose 求和字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49329538/