如何在 Mongodb 中获取条件字段

How to get conditional fields in Mongodb

你好开发者,

我是 MongoDB 的新手,正在尝试获取符合我要求的条件数据。

我有以下合集:

 [
{
    "id":10001,
    "name":"Test 1",
    "status":"live",
    "traffics":[
        {
            "id":"1a3s5d435a4sd",
            "status":"",
        },
        {
            "id":"1a3s5d44as54d35a4sd",
            "status":"CMP",
        },
        {
            "id":"a3s5d454asd34asd",
            "status":"",
        },
        {
            "id":"1a35sd45a4sd34asd3",
            "status":"TERM",
        },
        {
            "id":"as35d435a4sd354as3d43asd4",
            "status":"CMP",
        },
        {
            "id":"135as4d5a4sd354a3s5d43asd",
            "status":"CMP",
        },
        {
            "id":"123as1d31a3d12ads13as",
            "status":"TERM",
        }
    ]

},
{...},{...}
]

我想获取这样的数据

ID, Name, count traffics as Starts, count (traffics where status = "CMP") as completes, count (traffics where status = "TERM") as Terminates, count (traffics where status = "") as Abandons

我正尝试运行遵循命令

db.inventory.aggregate( { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, _id: 0}})

但我不知道如何在其中获取条件数据

我认为您可能需要运行 独立的聚合语句并使用 $match 语句。

$match: {
    status: "CMP"
}

$match: {
    status: "TERM"
}

$match: {
    status: ""
}

试试这个代码。 $filter 运算符可从 Mongodb 3.2 版本开始使用。

db.inventory.aggregate( [ 
    { $project: {id: 1, status: 1, starts: {$size: "$traffics"}, 
      completes:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"CMP"]}}}},   
      terminates:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,"TERM"]}}}},
      abandons:{$size: {$filter:{input:"$traffics",as:"item",cond:{$eq:[$$item.status,""]}}}},
      _id: 0}
    } 
 ] )

希望对您有所帮助

我能够稍微修改@Yones 的回答,以便我可以根据条件获取记录数。

所以这是我对此的查询。

db.collection.aggregate({
  $project: {
    id: 1,
    name: 1,
    status: 1,
    starts: {$size: "$traffics"},
    completes: {
        $size: {
            $filter: {
            input: "$traffics",
            as: "item",
            cond: {
                $eq: [
                    "$$item.status",
                    "CMP"
                    ]
                }
            }
        }
    },
    terminates: {
        $size: {
            $filter: {
            input: "$traffics",
            as: "item",
            cond: {
                $eq: [
                    "$$item.status",
                    "TERM"
                    ]
                }
            }
        }
    },
    abandons: {
        $size: {
            $filter: {
            input: "$traffics",
            as: "item",
            cond: {
                $eq: [
                    "$$item.status",
                    ""
                    ]
                }
            }
        }
    },
    _id: 0
  }
})

我只是根据我的条件使用 $filter

过滤掉记录

然后我使用 $size 计算它的大小。

这是此答案的工作示例:https://mongoplayground.net/p/TcuLlJShclA