我有两个Mongoose架构/模型。一个用于Team
个玩家,一个用于Players
个用户。
团队:
// Other less relevant stuff
goalkeepers: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Player'
}],
defenders: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Player'
}],
midfielders: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Player'
}],
attackers: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Player'
}],
points: Number
播放器:
// Other less relevant stuff
points: Number
问题在于我需要Team
点作为每个位置数组中Players
的所有点的总和。
我目前正在研究的领域是MongoDB聚合函数,特别是$sum
,但没有一个示例包含ref
个对象。首先需要填充对象,以便可以读取点值。
我觉得以前有人必须遇到过这个问题但不幸的是我的搜索都是徒劳的。
答案 0 :(得分:0)
您可以使用 $lookup
运算符在ref字段上进行连接。但首先你需要创建一个包含所有玩家_id的字段,最好的操作符是 $setUnion
运算符,它接受两个或多个数组并返回一个包含出现在任何输入数组中的元素。这是 $project
管道阶段的理想选择,您可以将所有数组字段与播放器引用组合成一个数组,然后您可以 denormalise ,为 $lookup
加入做准备。
考虑以下聚合管道:
Team.aggregate([
{
"$project": {
"players": {
"$setUnion": [
"$goalkeepers",
"$defenders",
"$midfielders",
"$attackers"
]
}
}
},
{ "$unwind": "$players" },
{
"$lookup": {
"from": "players",
"localField": "players",
"foreignField": "_id",
"as": "resultingArray"
}
},
{ "$unwind": "$resultingArray" },
{
"$group": {
"_id": "$_id",
"total": { "$sum": "$resultingArray.points" }
}
}
], function(err, result){
console.log(result);
});