我有以下文件:
{
"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/
Python的itertools模块提供了很多关于使用生成器处理可迭代/迭代器的好东西。例如,permutations(range(3))-->012021102120201210combinations('ABCD',2)-->ABACADBCBDCD[list(g)fork,gingroupby('AAAABBBCCD')]-->AAAABBBCCDRuby中有哪些等价物?等效的,我的意思是快速和内存高效(Python的itertools模块是用C编写的)。 最佳答案 Array#permutation、Array#combin
我正在尝试用Vue2做一个可编辑的组件。它应该在任何标签中使用contenteditable属性,替换普通输入。我想给它一个占位符功能,以便在用户没有提供任何值时显示一个值,但我似乎无法让它工作。我正在观察组件的当前值,并在不存在用户内容时将data.isEmpty设置为true。该组件随后应显示占位符值,但目前它什么都不显示。如果我console.logrender方法的结果,它将显示占位符子节点已正确实例化,但由于某些原因它不会显示在最终的HTML上。这是一个JSFiddle:https://jsfiddle.net/dy27fa8t/对于那些喜欢它的人来说,还有一个嵌入的片段:V
我有一个这样的对象数组:[{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=
给定一个像这样的对象数组: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){
我正在尝试使用这些参数实现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
在对象键上使用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
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
示例集合(仅显示模型):[{name:"Bob"date:"ThuMar292012"},{name:"James"date:"FriMar302012"},{name:"Dylan"date:"FriMar302012"},{name:"Stanley"date:"SatMar312012"},]如何使用Underscore.js的groupBy函数对具有相同日期的模型进行分组? 最佳答案 如果你正在对一个实际的Backbone集合进行分组,你可以使用Backbone方法groupBy,它隐含地使用下划线_.groupBy功能。在
我需要帮助。我需要在子文件("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中的
假设我有以下结构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