如何在php中使用Mongo聚合来获取计数器?

时间:2018-01-19 15:39:23

标签: php mongodb

我试图查询属性上的集合以获取其不同值的计数器。我只按一个属性分组。无论集合中的数据类型如何,请求都必须正常工作。

集合

[
    {"name":"michel","bday":"1977-07-21"},
    {"name":"michel","bday":"1985-06-21"},
    {"name":"jean","bday":"1989-10-07"}
]

按bday年份分组输出

[
    {"1977" : 1},
    {"1985" : 1},
    {"1989" : 1}
] 

按名称分组输出

[
    {"michel" : 2},
    {"jean" : 1}
] 

我设法对名称进行分组,但如果我没有设法在日期上分组。 对于约会,我可以决定按照格式(月份或年份,......)分组

我有两个问题:

  • 如果我的日期是字符串,我不能使用$ dateToString。
  • 如果我的日期是ISODate,则该函数返回一个对象" UTCDateTime(以毫秒为单位)"而不是日期格式。

我希望有一个管道可以管理所有内容。

我目前的渠道:

Array(
    [0] => Array(
            [$project] => Array(
                    [bday] => Array(
                            [$dateToString] => Array(
                                    [format] => %Y
                                    [date] => $bday
                                )
                        )
                )
        )
    [1] => Array(
            [$group] => Array(
                    [_id] => $bday
                    [count] => Array(
                            [$sum] => 1
                        )
                )
        )
)

只有当字段是日期时才可以应用dateToString吗?

2 个答案:

答案 0 :(得分:0)

您可以使用$cond运算符来检查$type运算符的数据类型;如果日期类型为$dateToString,则为$substrCP,以便在$group阶段获得年份。

这样的东西
{"$group":{
  "_id":{
    "$cond":{
      "if":{"$eq":[{"$type":"$bday"},"date"]},
      "then":{"$dateToString":{"format":"%Y","date":"$bday"}},
      "else":{"$substrCP":["$bday",0,4]}
    }
  },
  "count":{"$sum":1}
}} 

答案 1 :(得分:0)

感谢您的回复。我对“$ type”有错误。

  

“无效的运算符'$ type'”。

我也试试:

'$bday' => array('$type' => 'date')

我使用mongo 3.2.10。

最后,我使用$ match stage来确定$ type。解决方案:

{
    $match: {
        "bday": {
            "$type": "date"
        }
    }
},
{
    $group: {
        "_id": {
            "$dateToString": {
                "format": "%Y",
                "$bday"
            }
        },
        "count": {
            "$sum": 1
        }
    }
}