如何确定mongoDB中字段的非重复值计数

afdcj2ne  于 2023-01-04  发布在  Go
关注(0)|答案(1)|浏览(163)

我有一个名为INFODOCS的集合,其中有一个名为PROCESSOR_ID和STATUS(True/False/Null)的字段。

  1. Working_Processor =状态不为空的不同处理器ID的计数
    1.总处理器=不同处理器ID的计数
    信息文档
[
  {
    "_id": "1",,
    "PROCESSOR_ID" : "11",
    "STATUS" : "True"
  },
  {
    "_id": "2",
    "PROCESSOR_ID" : "11",
    "STATUS" : ""
  },
  {
    "_id": "3",
    "PROCESSOR_ID" : "22",
    "STATUS" : "False"
  },
  {
    "_id": "4",
    "PROCESSOR_ID" : "33",
    "STATUS" : ""
  }
]

这里的预期答案是:正在工作的处理器= 2(ID:1和ID:3)处理器总数= 3
我试着使用$addToSet和$cond,但想知道是否有更好的方法来实现相同的效果。

[
    {
        '$group': {
            '_id': None, 
            'WORKING_PROCESSOR': {
                '$addToSet': {
                    '$cond': [
                        {
                            '$ne': [
                                '$STATUS', ''
                            ]
                        }, '$PROCESSOR_ID', None
                    ]
                }
            }, 
            'TOTAL_PROCESSOR': {
                '$addToSet': '$PROCESSOR_ID'
            }
        }
    }, {
        '$project': {
            '_id': 0, 
            'WORKING_PROCESSOR': {
                '$subtract': [
                    {
                        '$size': '$WORKING_PROCESSOR'
                    }, 1
                ]
            }, 
            'TOTAL_PROCESSOR': {
                '$size': '$TOTAL_PROCESSOR'
            }
        }
    }
]
jmp7cifd

jmp7cifd1#

一个简单的选择是:

db.collection.aggregate([
  {$group: {
      _id: "$PROCESSOR_ID",
      WORKING_PROCESSOR: {$max: {$cond: [{$ne: ["$STATUS", ""]}, 1, 0]}}
  }},
  {$group: {
      _id: 0,
      WORKING_PROCESSOR: {$sum: "$WORKING_PROCESSOR"},
      TOTAL_PROCESSOR: {$sum: 1}
  }},
  {$unset: "_id"}
])

了解它在playground example上的工作原理

相关问题