Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB计数和groupby子文档_Mongodb - Fatal编程技术网

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@白蚁