如何在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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用多个条件查找查询在 MongoDB 中指定字段?

MongoDB批量更新不同查询条件的数据

如何在 MongoDB 中为单个模型添加 2 个引用?

mongodb更新数组中的单个对象

如何在 MongoDB 查询中编写 3 个条件? [关闭]

在单个聚合查询 mongodb 中组合多个 $samples