如何在mongodb中运行以撤消$unwind并在对象数组上运行$match
我正在使用mongoDB Atlas为应用程序创建一个管道。 这是我目前的管道如何在mongodb中运行以撤消$unwind并在对象数组上运行$match,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在使用mongoDB Atlas为应用程序创建一个管道。 这是我目前的管道 [ { '$match': { 'serverid': 11 } }, { '$lookup': { 'from': 'runs', 'localField': 'discord_id', 'foreignField': 'advertiser',
[
{
'$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)'s运行只在两个时间点之间返回对象的匹配
现在,我需要将这些对象放回一个数组中,以便为与这些运行相关联的每个用户运行$sum,我已经尝试过这样做,但无法做到
作为参考,我将为我的“用户”和“运行”集合留下一个示例文档
用户:
运行:
非常感谢你
预期的结果是再次拥有一个包含所有run对象的数组,这样我就可以用一个简单的$addField和$sum对boosterCut、advertiserCut或communityCut求和,而无需解开
adRuns
数组,您可以尝试
迭代$reduce
数组的循环,在必填字段中输入空值,使用adRuns
求和值,使用$add
将对象与当前对象合并$mergeObjects
不需要展开
adRuns
阵列,您可以尝试
迭代$reduce
数组的循环,在必填字段中输入空值,使用adRuns
求和值,使用$add
将对象与当前对象合并$mergeObjects
“我需要将对象放回数组中才能运行$sum…”:您可以尝试使用
$group
和$sum
($sum可以在$group中使用)。尝试此操作后,group的问题是我没有签名用户。\u我想要分组的id,似乎需要哪个$group。您可以在username
字段(或用户的唯一id字段)上分组。即使要将对象放回数组中,也需要使用$group
(以及$push
聚合操作符)。我不确定我是否完全理解您的评论。@JoshuaBroussard在提供的答案中是否有您认为无法解决您问题的内容?如果是,请对答案进行评论,以澄清哪些问题需要解决,哪些问题尚未解决。如果它确实回答了您提出的问题,那么请注意您提出的问题“我需要将对象放回数组中以运行$sum…”:您可以尝试使用$group
和$sum
($sum可以在$group中使用)。尝试此操作,group的问题是我没有签名用户。\我想要分组的id,$group似乎需要。您可以在username
字段(或用户的唯一id字段)上分组。即使要将对象放回数组中,也需要使用$group
(以及$push
聚合操作符)。我不确定我是否完全理解您的评论。@JoshuaBroussard在提供的答案中是否有您认为无法解决您问题的内容?如果是,请对答案进行评论,以澄清哪些问题需要解决,哪些问题尚未解决。如果它确实回答了您提出的问题,那么请注意您提出的问题
{
"_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
}
{
$addFields: {
adRunsSum: {
$reduce: {
input: "$adRuns",
initialValue: {
boosterCut: 0,
communityCut: 0,
advertiserCut: 0
},
in: {
$mergeObjects: [
"$$value",
{
boosterCut: {
$add: ["$$this.boosterCut", "$$value.boosterCut"]
},
communityCut: {
$add: ["$$this.communityCut", "$$value.communityCut"]
},
advertiserCut: {
$add: ["$$this.advertiserCut", "$$value.advertiserCut"]
}
}
]
}
}
}
}
}