在MongoDB中对对象数组进行分组并获取计数。

huangapple go评论106阅读模式
英文:

group array of objects and get the count in mongodb

问题

  1. 我有一个对象数组:
  2. [
  3. {
  4. medicationDetails: {
  5. category: 'Asthma',
  6. subCategory: '',
  7. providedBy: 'Doctor'
  8. }
  9. },
  10. {
  11. medicationDetails: {
  12. category: 'Diabetes',
  13. subCategory: 'Oral',
  14. providedBy: 'Nurse'
  15. }
  16. },
  17. {
  18. medicationDetails: {
  19. category: 'Asthma',
  20. subCategory: '',
  21. providedBy: 'Doctor'
  22. }
  23. },
  24. {
  25. medicationDetails: {
  26. category: 'Diabetes',
  27. subCategory: 'Insulin',
  28. providedBy: 'Doctor'
  29. }
  30. }
  31. ]
  32. 一些药物可能有子类别,而其他的则没有。
  33. 需要根据'category''sub-category''providedBy'进行分组,并获得如下计数:
  34. [
  35. {
  36. medicationDetails: [
  37. {
  38. name: 'Asthma',
  39. providedByDoctorCount: 2,
  40. providedByNurseCount: 0
  41. },
  42. {
  43. name: 'Oral',
  44. providedByDoctorCount: 0,
  45. providedByNurseCount: 1
  46. },
  47. {
  48. name: 'Insulin',
  49. providedByDoctorCount: 1,
  50. providedByNurseCount: 0
  51. }
  52. ]
  53. }
  54. ]
  55. 我尝试了$group$count,但没有得到预期的结果。
  56. 需要一些有价值的帮助。
英文:

I am having an array of objects:

  1. [
  2. {
  3. medicationDetails: {
  4. category: 'Asthma',
  5. subCategory: '',
  6. providedBy: 'Doctor'
  7. }
  8. },
  9. {
  10. medicationDetails: {
  11. category: 'Diabetes',
  12. subCategory: 'Oral',
  13. providedBy: 'Nurse'
  14. }
  15. },
  16. {
  17. medicationDetails: {
  18. category: 'Asthma',
  19. subCategory: ''
  20. providedBy: 'Doctor'
  21. }
  22. },
  23. {
  24. medicationDetails: {
  25. category: 'Diabetes',
  26. subCategory: 'Insulin',
  27. providedBy: 'Doctor'
  28. }
  29. }
  30. ]

Some medication will have sub-category and some doesn't.

Need to group based on 'category', 'sub-category' and 'providedBy' and get the count like this:

  1. [
  2. {
  3. medicationDetails: [
  4. {
  5. name: 'Asthma',
  6. providedByDoctorCount: 2,
  7. providedByNurseCount: 0
  8. },
  9. {
  10. name: 'Oral',
  11. providedByDoctorCount: 0,
  12. providedByNurseCount: 1
  13. },
  14. {
  15. name: 'Insulin',
  16. providedByDoctorCount: 1,
  17. providedByNurseCount: 0
  18. }
  19. ]
  20. }
  21. ]

I was tried with $group and $count but not getting the expected result.
Need some valuable help.

答案1

得分: 1

  1. 基本上与您的先前问题类似。

  2. 在分组时,可以根据字段的值进行有条件求和。

  3. 基于 categorysubCategory 的值创建一个 key 字段。

  4. 根据 providedBy 的值,有条件地将其添加到 providedByDoctorprovidedByNurse 中。

  5. 将其分组成单个的 medicationDetails 数组。

  1. db.collection.aggregate([
  2. {
  3. $project: {
  4. providedBy: "$medicationDetails.providedBy",
  5. key: { $cond: [ { $eq: [ "$medicationDetails.subCategory", "" ] }, "$medicationDetails.category", "$medicationDetails.subCategory" ] }
  6. }
  7. },
  8. {
  9. $group: {
  10. _id: "$key",
  11. providedByDoctor: { $sum: { $cond: [ { $eq: [ "$providedBy", "Doctor" ] }, 1, 0 ] } },
  12. providedByNurse: { $sum: { $cond: [ { $eq: [ "$providedBy", "Nurse" ] }, 1, 0 ] } } }
  13. },
  14. { $group: { _id: null, medicationDetails: { $push: { name: "$_id", providedByDoctorCount: "$providedByDoctor", providedByNurseCount: "$providedByNurse" } } } },
  15. { $unset: "_id" }
  16. ])

playground

英文:

somewhat similar to your previous question.
you can conditionally sum based on the value of the field when grouping

  1. Create a key field based on category and subCategory values
  2. Group by the key and add to providedByDoctor or providedByNure conditionally based on the value of providedBy
  3. Group into a single medicationDetails array
  1. db.collection.aggregate([
  2. {
  3. $project: {
  4. providedBy: "$medicationDetails.providedBy",
  5. key: { $cond: [ { $eq: [ "$medicationDetails.subCategory", "" ] }, "$medicationDetails.category", "$medicationDetails.subCategory" ] }
  6. }
  7. },
  8. {
  9. $group: {
  10. _id: "$key",
  11. providedByDoctor: { $sum: { $cond: [ { $eq: [ "$providedBy", "Doctor" ] }, 1, 0 ] } },
  12. providedByNurse: { $sum: { $cond: [ { $eq: [ "$providedBy", "Nurse" ] }, 1, 0 ] } } }
  13. },
  14. { $group: { _id: null, medicationDetails: { $push: { name: "$_id", providedByDoctorCount: "$providedByDoctor", providedByNurseCount: "$providedByNurse" } } } },
  15. { $unset: "_id" }
  16. ])

playground

huangapple
  • 本文由 发表于 2023年6月4日 23:17:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/76401082.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定