Bra*_*son 2 mongodb mongodb-query aggregation-framework
我正在尝试运行一个 mongodb 查询,对于请求的每一天,它将返回不同列中唯一值的计数。例如,对于六月,查询将返回日期以及该日期 b 列中不同值的计数。任何人都知道如何做到这一点我尝试了几种不同的方法但没有运气
下面是几个示例文档,以及输出应该是什么
{
"_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
"IP" : "123.123.123.123",
"datetime" : ISODate("2016-07-20T10:04:56-05:00")
},
{
"_id" : ObjectId("578fa05a7391bb0d34bd3c28"),
"IP" : "110.123.1.2",
"datetime" : ISODate("2016-07-20T10:04:56-05:00"),
}
Run Code Online (Sandbox Code Playgroud)
输出应该是
{
"date":"2016-07-20",
count:2 -- this is distinct number of IPs for the date above
}
Run Code Online (Sandbox Code Playgroud)
使用aggregate,您可以执行以下操作:
$project$group这两个项目用于将 day-month-year 拆分为一个新字段,以便在 $group
mongo 查询是:
db.device.aggregate([{
$project: {
_id: 1,
IP: 1,
day: {
"$dayOfMonth": "$datetime"
},
month: {
"$month": "$datetime"
},
year: {
"$year": "$datetime"
}
}
}, {
$project: {
_id: 1,
IP: 1,
datetime: {
$concat: [{
$substr: ["$year", 0, 4]
},
"-", {
$substr: ["$month", 0, 2]
},
"-", {
$substr: ["$day", 0, 2]
}
]
}
}
}, {
$group: {
_id: {
date: "$datetime",
IP: "$IP"
}
}
}, {
$group: {
_id: "$_id.date",
count: {
$sum: 1
}
}
}])
Run Code Online (Sandbox Code Playgroud)
$sum:1 用于计算您的字段
它会给你这样的东西:
{ "_id" : "2016-7-20", "count" : 2 }
{ "_id" : "2016-8-20", "count" : 1 }
Run Code Online (Sandbox Code Playgroud)
对于输入数据:
> db.device.find()
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c28"), "IP" : "123.123.123.123", "datetime" : ISODate("2016-07-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c29"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-07-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c25"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-07-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c30"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-08-20T15:04:56Z") }
{ "_id" : ObjectId("578fa05a7391bb0d34bd3c12"), "IP" : "110.123.1.2", "datetime" : ISODate("2016-08-20T15:04:56Z") }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2148 次 |
| 最近记录: |