如何在mongodb的单个查询中添加具有不同条件输出的Multiple Group By?
Posted
技术标签:
【中文标题】如何在mongodb的单个查询中添加具有不同条件输出的Multiple Group By?【英文标题】:How to add Multiple Group By with different conditions output in single query in mongodb? 【发布时间】:2022-01-15 18:15:30 【问题描述】:您好,我是从 sql 到 mongodb 的新手, 我想要 mongodb 中的特定数据,可以使用子查询在 sql 中轻松获得 请帮助如何在 mongodb 中获得所需的输出。
需要用学生姓名在单个对象中获取不同学科学生的平均值
存储对象:
[
StudentsName:"AKshay",_id:"feferf","subject_name":"SubjectA","marks":"28",
StudentsName:"AKshay",_id:"feferf","subject_name":"SubjectB","marks":"50" ,
StudentsName:"AKshay",_id:"feferf","subject_name":"SubjectA","marks":"28",
StudentsName:"AKshay",_id:"feferf","subject_name":"SubjectB","marks":"50",
]
需要的输出:
StudentsName:"AKshay",_id:"feferf","SubjectA":"28","SubjectB":"50"
已经通过 match 使用了 group,但是它在具有相同 _id 的不同对象中给出了不同的数组对象。 甚至尝试过方面...
【问题讨论】:
每个文档应该有不同的_id
,如果你能提供有效的json数据,几乎没问题,但我没有看到你放了相同的_id
,我认为有问题。
【参考方案1】:
首先,我在这里看到了设计的味道,为什么每个笔记都有不同的文档?我猜您正在考虑使用事务数据库,但使用的是文档数据库,您可以在其中拥有不同的级别并将所有注释添加到单个文档中。
也就是说,您可以使用聚合管道进行此查询,这里有如何:
[$group: // First you need to group your data, I think that you could save the data already in that format and use only one step in the aggregation pipeline.
_id: '$StuddentName',
notesA:
$push:
$toInt: '$SubjectA' //Why your notes are strings? you could avoid the $toInt using integers directly
,
notesB:
$push:
$toInt: '$SubjectB'
, $project: // Here is where you get the AVG
avgA:
$avg: '$notesA'
,
avgB:
$avg: '$notesB'
]
或者,更好的是,您可以使用@takis 建议的解决方案,它只使用一个步骤:https://cmql.org/play/?q=70314926
您可以在 official mongo documentation 中找到完整的聚合运算符,如果您使用的是 mongo compass 或 Atlas,聚合选项卡对于尝试您的管道非常有用。
【讨论】:
你可以像this 一样在 1 步中完成这两项工作,因为 avg 既适用于数组,也适用于累加器 你是对的!我将在我的答案中添加您的解决方案 感谢您的回复完成了解决方案,如果我有密钥,因为“主题 A”已更新文档,请检查你们是否可以提供帮助 所以你想在值中转换键.. 我认为这是可能的,你可以看到this question and its answers,但是正如@jairo-malanay 指出的那样,这似乎是一个地图问题,我认为哟需要考虑将您的应用程序用于该映射以上是关于如何在mongodb的单个查询中添加具有不同条件输出的Multiple Group By?的主要内容,如果未能解决你的问题,请参考以下文章