我正在try 编写一个Mongo查询,以帮助从数据中生成报告.

这些文件看起来像这样:

[{
    "DeviceType" : "A",
    "DeviceStatus" : "On"
},
{
    "Device Type" : "B",
    "Device Status" : "On"
},
{
    "DeviceType" : "A",
    "DeviceStatus" : "Off"
},
{
    "DeviceType" : "A",
    "DeviceStatus" : "On"
}]

DeviceType字段可以接受任何字符串值,DeviceStatus字段可以是OnOffInRepair中的任何一个.我想编写一个mongo查询,显示每个设备的DeviceStatus个计数.结果应该是这样的:

[{
    "DeviceType" : "A",
    "DeviceStatusOnCount" : "15",
    "DeviceStatusOffCount" : "13",
    "DeviceStatusInRepairCount" : "12",
},
{
    "DeviceType" : "B",
    "DeviceStatusOnCount" : "6",
    "DeviceStatusOffCount" : "14",
    "DeviceStatusInRepairCount" : "2",
}]

我如何在Mongo中实现这一点?

我当前的查询只能按DeviceType进行分组:

db.Collection_Name.aggregate([
    { $group: { _id: "$DeviceType", count: { $sum: 1 } } }
])

推荐答案

您可以使用$cond+$eq将1或0返回到$sum运算符:

db.collection.aggregate([
  {
    $group: {
      _id: "$DeviceType",
      DeviceStatusOnCount: { $sum: { $cond: [ { $eq: [ "$DeviceStatus", "On" ] }, 1, 0 ] } },
      DeviceStatusOffCount: { $sum: { $cond: [ { $eq: [ "$DeviceStatus", "Off" ] }, 1, 0 ] } },
      DeviceStatusInRepairCount: { $sum: { $cond: [ { $eq: [ "$DeviceStatus", "InRepair" ] }, 1, 0 ] } }
    }
  },
  {$addFields: {DeviceType: '$_id'}}, {$project: {_id:0}}
])

Test:mongoplayground

Database相关问答推荐

如何高效地存储 100 万个单词并通过starts_with、contains 或ends_with 进行查询?

Postgresql:优化数字字段的列大小

在 model.save() 中处理竞争条件

Cassandra 还是 MySQL/PostgreSQL?

SQLite 如果列存在

如何在构建时创建填充的 MySQL Docker 映像

C# 连接到数据库并列出数据库

我可以在没有数据源的情况下配置 Grails 吗?

MS Access 迁移的前端?

避免从网站数据库中data scraping数据抓取?

SQLite3 不支持外键约束吗?

customer客户表的数据库 struct ,每个客户有很多订单,每个订单有很多商品

如果数据库已经提供缓存,为什么还要使用应用程序级缓存?

在 Firestore 中使用嵌套的单个查询

维护 mgo 会话的最佳实践

使用默认路径中的文件创建数据库

如何将特定的、可变的 order订单保存到数据库中

如何删除除了postgres中的少数数据库之外的所有数据库

如何将 mongodb 数据库转移到另一台看不到第一个的机器上

什么是数据库中的父表和子表?