草庐IT

MongoDB Count 和 groupby 子文档

coder 2023-10-31 原文

我有以下文件:

{
    "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"}
     ]
}

如果我想计算有多少唯一 ips (groupBy),我该如何使用 mongo 来实现?

最佳答案

使用 aggregation framework 以获得所需的结果。聚合管道将有一个 $unwind操作作为从输入文档解构 views 数组字段以输出每个元素的文档的第一步。每个输出文档用一个元素值替换数组。下一个流水线阶段 $group然后按 "views.ip" 字段对文档进行分组,计算每个组的 count 字段,并为每个唯一状态输出一个文档。 新的 per-ip 文档有两个字段:_id 字段和 count 字段。 _id 字段包含唯一 IP 地址的值;即按字段分组。 count 字段是一个计算字段,其中包含每个唯一 IP 的总 ip 计数。要计算该值,$group使用 $sum运算符来计算 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
}

-- 更新 --

要获得所有唯一 IP 的总数,您需要另一个 $group pipeline 阶段,这次 _id 为 null,也就是说,你将之前管道流中的所有文档分组为一个,然后使用相同的 $sum对该组进行操作以获得计数总数。聚合管道最终看起来像这样:

db.collection.aggregate([
    {
        "$unwind": "$views"
    },
    {
        "$group": {
            "_id": "$views.ip",
            "count": {
                "$sum": 1
            }
        }
    },
    {
        "$group": {
            "_id": null,
            "total": {
                "$sum": "$count"
            }
        }
    }
])

输出:

/* 1 */
{
    "result" : [ 
        {
            "_id" : null,
            "total" : 4
        }
    ],
    "ok" : 1
}

关于MongoDB Count 和 groupby 子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30154808/

有关MongoDB Count 和 groupby 子文档的更多相关文章

  1. ruby - Python itertools 的 Ruby 等价物是什么,尤其是。组合/排列/groupby? - 2

    Python的itertools模块提供了很多关于使用生成器处理可迭代/迭代器的好东西。例如,permutations(range(3))-->012021102120201210combinations('ABCD',2)-->ABACADBCBDCD[list(g)fork,gingroupby('AAAABBBCCD')]-->AAAABBBCCDRuby中有哪些等价物?等效的,我的意思是快速和内存高效(Python的itertools模块是用C编写的)。 最佳答案 Array#permutation、Array#combin

  2. javascript - 使用渲染功能时 Vue 组件不显示子文本节点 - 2

    我正在尝试用Vue2做一个可编辑的组件。它应该在任何标签中使用contenteditable属性,替换普通输入。我想给它一个占位符功能,以便在用户没有提供任何值时显示一个值,但我似乎无法让它工作。我正在观察组件的当前值,并在不存在用户内容时将data.isEmpty设置为true。该组件随后应显示占位符值,但目前它什么都不显示。如果我console.logrender方法的结果,它将显示占位符子节点已正确实例化,但由于某些原因它不会显示在最终的HTML上。这是一个JSFiddle:https://jsfiddle.net/dy27fa8t/对于那些喜欢它的人来说,还有一个嵌入的片段:V

  3. javascript - lodash 中的 groupBy 计数 - 2

    我有一个这样的对象数组:[{rating:1},{rating:2},{rating:3},{rating:1}]我想要这样的结果-{1:2,2:1,3:1}它将是Rating_Value:Count。我怎样才能在lodash中做到这一点?或者是否可以在没有lodash的情况下进行优化? 最佳答案 您可以使用lodash#countBy.varresult=_.countBy(data,'rating');vardata=[{rating:1},{rating:2},{rating:3},{rating:1}];varresult=

  4. javascript - 在使用 Lo-Dash 3.0 转换值时有什么好的 groupBy 方法? - 2

    给定一个像这样的对象数组:vardata=[{key:'a',val:'1'},{key:'a',val:'2'},{key:'b',val:'3'},{key:'c',val:'4'},{key:'c',val:'5'},{key:'c',val:'6'}];我想把它转换成这样:vardesiredResults={'a':[1,2],'b':[3],'c':[4,5,6]};到目前为止,我已经找到了两种使用lodash-fp实现此目的的方法,但我仍然想知道是否有更好的方法。第一种方式有点程序化:varout=_(data).transform(function(out,item){

  5. javascript - 在 Javascript 中实现 GroupBy 最有效的方法是什么? - 2

    我正在尝试使用这些参数实现GroupBy方法functionGroupBy(keySelector,elementSelector,comparer){//keySelector=function(e){returne.ID}//elementSelector=function(e){returne.Name}//comparer={Equals:function(a,b){returna==b},GetHashCode:...}}但是我不知道实现它的有效方法。IcreatedajsPerftest使用linq.js和我创建的一种方法,它不使用比较器,只适用于平面类型。(Outputt

  6. javascript - Lodash groupBy 在对象上保留键 - 2

    在对象键上使用Lodash_.groupBy方法时,我想保留键。假设我有对象:foods={apple:{type:'fruit',value:0},banana:{type:'fruit',value:1},broccoli:{type:'vegetable',value:2}}我想做一个转换来得到输出transformedFood={fruit:{apple:{type:'fruit',value:0},banana:{type:'fruit',value:1}},vegetable:{broccoli:{type:'vegetable',value:2}}}执行transform

  7. javascript - 如何在 Angular 2 中执行 groupBy 操作? - 2

    Angular2:2.0.0-alpha.31/typescript1.5我从http.get查询请求数据this.http.get('/data/players.json').toRx().map((res)=>res.json()).subscribe((data)=>{this.players=data;});这个查询返回这个Json对象(this.players)[{"team":"teamA","name":"player1","age":"1"},{"team":"teamA","name":"player2","age":"1"},{"team":"teamA","nam

  8. javascript - Backbone.js中如何使用groupBy对集合进行分组? - 2

    示例集合(仅显示模型):[{name:"Bob"date:"ThuMar292012"},{name:"James"date:"FriMar302012"},{name:"Dylan"date:"FriMar302012"},{name:"Stanley"date:"SatMar312012"},]如何使用Underscore.js的groupBy函数对具有相同日期的模型进行分组? 最佳答案 如果你正在对一个实际的Backbone集合进行分组,你可以使用Backbone方法groupBy,它隐含地使用下划线_.groupBy功能。在

  9. templates - tmpl.Execute 和子文件 golang - 2

    我需要帮助。我需要在子文件("article.html",我的文本中的示例)://...typePagestruct{Teststring}typeNewsstruct{PageTitlestring}funcmain(){t,_:=template.ParseFiles(filepath+"core.tmpl",filepath+"article.tmpl")p:=&News{Title:"TITLE",Page:Page{Test:"TITLE",},}t.Execute(wr,p)}core.tmpl中的代码:{{template"article"}}article.tmpl中的

  10. mongodb - 根据 Go 子文档中的字段对 mongodb 查询进行排序 - 2

    假设我有以下结构typeTeststruct{Titlestring`bson:"title"json:"title"`UpdateUpdate`bson:"update"json:"update"`}typeUpdatestruct{Changes[]string`bson:"change"json:"change"`UpdatedAttime.Time`bson:"updatedAt"json:"updatedAt"`}假设我想按“update.updatedAt”对查询中的结果进行排序cs.Find(bson.M{title:"sometitle"}).Sort("-update

随机推荐