我试图查询属性上的集合以获取其不同值的计数器。我只按一个属性分组。无论集合中的数据类型如何,请求都必须正常工作。
集合
[
{"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}
]
我设法对名称进行分组,但如果我没有设法在日期上分组。 对于约会,我可以决定按照格式(月份或年份,......)分组
我有两个问题:
我希望有一个管道可以管理所有内容。
我目前的渠道:
Array(
[0] => Array(
[$project] => Array(
[bday] => Array(
[$dateToString] => Array(
[format] => %Y
[date] => $bday
)
)
)
)
[1] => Array(
[$group] => Array(
[_id] => $bday
[count] => Array(
[$sum] => 1
)
)
)
)
只有当字段是日期时才可以应用dateToString吗?
答案 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
}
}
}