首页 > 解决方案 > 如何在整个集合中进行仅总和查询?

问题描述

我有这个收藏

{ 
    "_id" : BinData(0, "JUw6VoBVdtqAQ2g7sn0sog=="), 
    "os_name" : "android" 
}

我想在一个聚合查询中检索文档计数

os_android => count of documents where "os_name" = "android" 
os_ios => count of documents where "os_name" = "ios"
total => the total count of document

我能怎么做 ?

我试试这个:

db.getCollection("myCollection").aggregate(
[
    {$group:{
      _id:{},
      by_os_ios:{$sum:{$cond:[{os_name:"ios"},NumberInt(1),NumberInt(0)]}},
      by_os_android:{$sum:{$cond:[{os_name:"android"},NumberInt(1),NumberInt(0)]}},
      total:{$sum:1}}
    },
    {$addFields:{
      "by_os.ios":"$by_os_ios",
      "by_os.android":"$by_os_android"}},
    {$project:{
      _id:0,
      by_os_ios:0,
      by_os_android:0}}
  ]
);

但这不起作用:(我错过了什么?

标签: mongodbmongodb-query

解决方案


您错过$eq$cond,您可以使用{ $eq:["$field_name", "value to matched"] }

db.getCollection("myCollection").aggregate([
  {
    $group: {
      _id: {},
      by_os_ios: { $sum: { $cond: [{ $eq: ["$os_name", "ios"] }, 1, 0] } },
      by_os_android: { $sum: { $cond: [{ $eq: ["$os_name", "android"] }, 1, 0] } },
      total: { $sum: 1 }
    }
  },
  ... // your other pipeline stages
])

操场


第二种可能的方式,

  • $group创建名为 root 的数组
  • $project使用总文档计数$size
  • $reduce遍历根数组并检查条件,如果它的 ios 然后求和,如果它的 android 然后求和$add并与当前的值对象合并$mergeObjects

操场


推荐阅读