MongoDB计数和groupby子文档
我有以下文件:MongoDB计数和groupby子文档,mongodb,Mongodb,我有以下文件: { "id":1, "url":"mysite.com", "views": [ {"ip":"1.1.1.1","date":"01-01-2015"}, {"ip":"2.2.2.2","date":"01-01-2015"}, {"ip":"1.1.1.1","date":"01-01-2015"}, {"ip":"1.1.1.1","date":"01-01-2015"}
{
"id":1,
"url":"mysite.com",
"views":
[
{"ip":"1.1.1.1","date":"01-01-2015"},
{"ip":"2.2.2.2","date":"01-01-2015"},
{"ip":"1.1.1.1","date":"01-01-2015"},
{"ip":"1.1.1.1","date":"01-01-2015"}
]
}
如果我想计算有多少个独特的IP(groupBy),我如何使用mongo进行计算?使用获得所需的结果。聚合管道将有一个操作作为第一步,它从输入文档解构视图
数组字段,以输出每个元素的文档。每个输出文档都用元素值替换数组。然后,下一个管道阶段通过“views.ip”
字段对文档进行分组,计算每个组的计数
字段,并为每个唯一状态输出文档。
新的每ip文档有两个字段:\u id
字段和计数
字段。\u id
字段包含唯一IP地址的值;i、 e.按字段分组。计数
字段是一个计算字段,包含每个唯一ip的总ip计数。要计算该值,请使用运算符计算IP地址的总数。因此,最终的聚合管道如下所示:
db.collection.aggregate([
{
"$unwind": "$views"
},
{
"$group": {
"_id": "$views.ip",
"count": {
"$sum": 1
}
}
}
])
输出:
/* 1 */
{
"result" : [
{
"_id" : "2.2.2.2",
"count" : 1
},
{
"_id" : "1.1.1.1",
"count" : 3
}
],
"ok" : 1
}
/* 1 */
{
"result" : [
{
"_id" : null,
"total" : 4
}
],
"ok" : 1
}
--更新-- 要获取所有唯一IP的总数,您需要另一个管道阶段,这次_id为null,即将前一个管道流中的所有文档分组为一个,然后对该组使用相同的操作来获取总数。聚合管道最终将如下所示:
db.collection.aggregate([
{
"$unwind": "$views"
},
{
"$group": {
"_id": "$views.ip",
"count": {
"$sum": 1
}
}
},
{
"$group": {
"_id": null,
"total": {
"$sum": "$count"
}
}
}
])
输出:
/* 1 */
{
"result" : [
{
"_id" : "2.2.2.2",
"count" : 1
},
{
"_id" : "1.1.1.1",
"count" : 3
}
],
"ok" : 1
}
/* 1 */
{
"result" : [
{
"_id" : null,
"total" : 4
}
],
"ok" : 1
}
@Broshi无需担心,很高兴能提供帮助。很抱歉再次询问,但我如何将1+3数字相加以获得所有唯一ip的总和?我不想通过PHP对它进行迭代……或者我应该为它提出一个新问题吗?有没有一种简单的方法可以在同一个查询中返回两种解决方案的混合?我的意思是,返回一个数组,其中包含每个IP的计数数,最后一个对象包含所有IP的总计数。例如:
[{u-id:“2.2.2.2”,“count”:1},{{u-id:“1.1.1.1”,“count”:3},{{{u-id:“total”,“count”:4}]
@charliebrownie你能为这个问题创建一个新问题吗?我的问题发布在这里:cc@白蚁