如何在Mongodb中获取条件字段

时间:2019-01-23 18:07:11

标签: mongodb mongodb-query php-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}})

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

3 个答案:

答案 0 :(得分:3)

尝试使用此代码。 Mongodb 3.2版本中提供了$ filter运算符。

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}
    } 
 ] )

希望获得帮助

答案 1 :(得分:2)

我能够对@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

答案 2 :(得分:1)

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

$match: {
    status: "CMP"
}

$match: {
    status: "TERM"
}

$match: {
    status: ""
}