输入:
{_id:ObjectID(123),ip:'123.123.123.123'}
{_id:ObjectID(123),ip:'123.123.123.123'}
{_id:ObjectID(124),ip:'123.123.123.124'}
{_id:ObjectID(125),ip:'123.123.123.125'}
输出:
{2019-03-20: 1}
{2019-03-21: 1}
{2019-03-22: 1}
我整天忙于从mongo ID中提取时间戳,并使用它对IP进行每日的独立计数,但我没有得到...我总是以每个IP结尾计数,例如在X天的IP被发现了4次...不是X天的唯一IP。
谢谢!
答案 0 :(得分:1)
您可以使用$toDate和$dateToString从ObjectId
获取日期,然后使用$addToSet获取每天的唯一IP地址。在最后一步中,您需要$size才能获得ip
数组的长度:
db.collection.aggregate([
{
$group: {
_id: { $dateToString: { date: { $toDate: "$_id" }, format: '%Y-%m-%d' } },
ip: { $addToSet: "$ip" }
}
},
{
$project: {
_id: 0,
date: "$_id",
ipCount: { $size: "$ip" }
}
}
])
答案 1 :(得分:1)
在MongoDB v3.8下,以下功能有效-感谢@mickl
db.getCollection('data').aggregate([
{
$group: {
"_id" : {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$_id"
}
},
"ip": { $addToSet: "$ip" }
}
},
{
$project: {
_id: 0,
date: "$_id",
ipCount: {
$size: "$ip"
}
}
},
{
$sort: {
date: -1
}
}
]);