gpt4 book ai didi

javascript - Mongo - 多个引用对象数组中的值的总和

转载 作者:行者123 更新时间:2023-11-28 05:29:17 25 4
gpt4 key购买 nike

我有两个 Mongoose 架构/模型。一个供团队玩家使用,另一个供玩家自己使用。

团队:

// 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 对象。还需要首先填充对象,以便可以读取点值。

我觉得以前肯定有人遇到过这个问题,但不幸的是我的搜索是徒劳的。

最佳答案

您可以使用$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);
});

关于javascript - Mongo - 多个引用对象数组中的值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39857144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com