【发布时间】:2021-02-07 04:28:04
【问题描述】:
我正在使用 mongoDB Atlas 为应用程序创建管道。 这是我目前的管道
[
{
'$match': {
'serverid': 11
}
}, {
'$lookup': {
'from': 'runs',
'localField': 'discord_id',
'foreignField': 'advertiser',
'as': 'adRuns'
}
}, {
'$lookup': {
'from': 'runs',
'localField': 'discord_id',
'foreignField': 'boosters',
'as': 'boosterRuns'
}
}, {
'$unwind': {
'path': '$adRuns',
'includeArrayIndex': 'string',
'preserveNullAndEmptyArrays': False
}
}, {
'$match': {
'adRuns._id': {
'$gte': ObjectId('5f91d6d83119c516d8e2c364')
}
}
}, {
'$match': {
'adRuns._id': {
'$lte': ObjectId('5f91ffffffffffffffffffff')
}
}
}
}
我展开一个对象数组,以便运行仅使用十六进制 ObjectId(_id) 的两个时间点之间返回对象的匹配
现在我需要将对象放回数组中,以便为与这些运行相关联的每个单独用户运行 $sum,我已经尝试过但无法做到。
作为参考,我将为我的“用户”和“运行”集合留下一个示例文档 用户:
{
"_id": {
"$oid": "5f8f1fa7b5212c7388bbae71"
},
"discord_id": "85479273153966080",
"username": "Chille#9733",
"character": "Chillelight",
"server": "illidan",
"serverid": 11
}
运行:
{
"_id": {
"$oid": "5f91d6d03119c516d8e2c365"
},
"advertiser": "85479273153966080",
"adType": "legendary",
"typeOfBoost": "mythic_plus",
"goldAmmount": "250000",
"server": "tichondrius",
"serverID": 6,
"boosters": ["85479273153966080", "131939237468700672", "85479273153966080", "131939237468700672"],
"boosterCut": 48437.5,
"advertiserCut": 62500,
"communityCut": 139062.5
}
非常感谢!
预期的结果是再次拥有所有运行对象的数组,以便我可以用简单的 $addField 和 $sum 对 boosterCut、advertisingrCut 或 communityCut 求和
【问题讨论】:
-
“我需要将对象放回数组中才能运行 $sum...”:您可以尝试使用
$group和$sum($sum 可以在 $group 中使用)。 -
试过了,group的问题是我没有想要分组的sign user._id,$group似乎需要这个。
-
您可以在
username字段(或用户的唯一ID 字段)上进行分组。即使要将对象放回数组中,您也需要使用$group(以及$push聚合运算符)。我不确定我是否完全理解您的评论。 -
@JoshuaBroussard 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,请对答案发表评论,以澄清究竟需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题
标签: mongodb mongodb-query