我有一个名为INFODOCS的集合,它有一个名为ML_PRIORITY(高/中/低)和Status(True/False/Null)的字段.我想确定每个ML_PRIORITY的状态计数,然后按高、中、低的顺序对ML_PRIORITY进行排序.

[
  {
    "_id": "1",
    "ML_PRIORITY" : "HIGH",
    "STATUS" : "True"
  },
  {
    "_id": "2",
    "ML_PRIORITY" : "HIGH",
    "STATUS" : ""
  },
  {
    "_id": "3",
    "ML_PRIORITY" : "HIGH",
    "STATUS" : "False"
  },
  {
    "_id": "4",
    "ML_PRIORITY" : "MEDIUM",
    "STATUS" : ""
  },
  {
    "_id": "5",
    "ML_PRIORITY" : "Low",
    "STATUS" : ""
  }
]

我能够使用下面的聚合管道确定每个ML_PRIORITY的状态计数 但我不确定如何对ML_PRIORITY进行自定义排序,因为$SORT只有两个选项(1和-1)

db.collection.aggregate([
    {
        '$group': {
            '_id': '$ML_PRIORITY', 
            'QUALITYCHECKDONE': {
                '$sum': {
                    '$cond': [
                        {
                            '$eq': [
                                '$STATUS', 'TRUE'
                            ]
                        }, 1, 0
                    ]
                }
            }, 
            'QUALITYCHECKNOTDONE': {
                '$sum': {
                    '$cond': [
                        {
                            '$eq': [
                                '$STATUS', ''
                            ]
                        }, 1, 0
                    ]
                }
            }, 
            'QUALITYCHECKNOTREQ': {
                '$sum': {
                    '$cond': [
                        {
                            '$eq': [
                                '$STATUS', 'FALSE'
                            ]
                        }, 1, 0
                    ]
                }
            }
        }
    }, {
        '$project': {
            '_id': 0, 
            'ML_PRIORITY': '$_id', 
            'QUALITYCHECKDONE': 1, 
            'QUALITYCHECKNOTDONE': 1, 
            'QUALITYCHECKNOTREQ': 1
        }
    }
])

示例--https://mongoplayground.net/p/anAwoqZk2Ys

推荐答案

一种 Select 是将最后一步替换为3个步骤,以便对order字段、$sort$unset字段进行$set:

[
 {$set: {
      order: {$indexOfArray: [["HIGH", "MEDIUM", "Low"], "$_id"]},
      "ML_PRIORITY": "$_id"
  }},
  {$sort: {order: 1}},
  {$unset: ["_id", "order"]}
]

看看它在playground example号公路上是如何工作的

Mongodb相关问答推荐

在MongoDB中使用explain()和查询时缺少winningPlan''''

映射数组值并查找每个匹配的集合

将消息流式传输到WebSocket

无法配置数据源:未指定url属性,无法为 MongoDb 配置嵌入数据源

MongoDb聚合查询问题

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

Mongodb,在一个查询中用正则表达式更新部分字符串

(MongoDB)在同一管道中结合联合和交集

程序可以运行,但我不断收到发送到客户端后无法设置标题,我应该忽略它吗?

Mongodb按值分组并计算出现次数

mongodb - 查找包含至少 3 个填充数组的记录

Ruby on Rails 的 Cassandra、mongodb 或 couchdb

mongodb:多键索引 struct ?

当属性确实存在时,为什么mongoose模型的 hasOwnProperty 返回 false?

Mongo 重启错误 -- /var/run/mongodb/mongod.pid 存在

MongoDB获取聚合查询的executionStats

单个模式数组中的多个模式引用 - mongoose

MongoDB - 文件大小巨大且不断增长

Meteor 发布/订阅独特客户端集合的策略

我可以使用字符串作为 mongodb 文档的 ID 类型吗?