MongoDB初识——安装连接(centos)
https://blog.csdn.net/maxmao1024/article/details/84426836

MongoDB入门——增删改查
https://blog.csdn.net/maxmao1024/article/details/84528649

1. 数据准备

> use test
> db.event.drop()
> db.event.insertMany([
{'event_id': 1, 'user_id': 1002, 'date': '2018-11-02'}
,{'event_id': 2, 'user_id': 1002, 'date': '2018-11-02'}
,{'event_id': 3, 'user_id': 1002, 'date': '2018-11-02'}
,{'event_id': 1, 'user_id': 1003, 'date': '2018-11-03'}
,{'event_id': 1, 'user_id': 1004, 'date': '2018-11-03'}
> db.event.find()
{ "_id" : ObjectId("5bfb68a511241f1551cacd9d"), "event_id" : 1, "user_id" : 1002, "date" : "2018-11-02" }
{ "_id" : ObjectId("5bfb68a511241f1551cacd9e"), "event_id" : 2, "user_id" : 1002, "date" : "2018-11-02" }
{ "_id" : ObjectId("5bfb68a511241f1551cacd9f"), "event_id" : 3, "user_id" : 1002, "date" : "2018-11-02" }
{ "_id" : ObjectId("5bfb68a511241f1551cacda0"), "event_id" : 1, "user_id" : 1003, "date" : "2018-11-03" }
{ "_id" : ObjectId("5bfb68a511241f1551cacda1"), "event_id" : 1, "user_id" : 1004, "date" : "2018-11-03" }
# 数据准备完毕,下面的查询等操作为了节约篇幅,一般不展示查询结果,有兴趣的同学可以自己尝试

2. find

> db.event.find({event_id:1})
# 基本查找语句, 返回3条文档
db.event.find({event_id:'1'})
# 与mysql 不同的是,mongo在查找时不会自动做类型转换,所以这个查询的返回结果为空
> db.event.find({event_id:1}).skip(1).limit(1)
# skip 和 limit 的使用, 返回1条文档
> db.event.find({event_id:1}).count()
> db.event.count()
> db.event.count({'event_id': 1})
# count 的使用
> db.event.distinct('event_id')
> db.event.distinct('event_id', {'user_id': 1003})
# distinct 的使用, 第一个是去重字段,第二个大括号里的是筛选条件
# 很遗憾的是distinct 后面不能接count了,后面会提到如何处理
> db.event.find({event_id:{$in:[1, 2]}})
> db.event.find({event_id:{$gt:1, $lt:3}})
# 范围查找,$gt, $lt, $gte, $lte
> db.event.find({'date': /2018/})
# 模糊查找,注意只对字符串类型的字段适用,例如user_id 就无法用模糊查找
> db.event.find({event_id:1}).explain()
# explain 的使用,和mysql类似,主要看使用索引的情况
> db.event.find({user_id:{$in:[null]}})  -- 为 null或不存在
> db.event.find({user_id:null}) -- 为 null或不存在
> db.event.find({user_id:{$in:[null],$exists:true}})  -- 存在且为null
> db.event.find({user_id:{$ne:null}}) -- 不为null
# 关于 null、not null 和 exists 的一些处理方法

3. index

> db.event.getIndexes()
# 查看集合的所有索引,默认会有 _id 字段的索引
> db.event.ensureIndex({"event_id": 1})
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
# 添加索引
> db.event.ensureIndex({"event_id": 1}, {background: 1}) 
# 在后台添加索引,在集合比较大的时候必须使用后台添加,否则会阻塞其他操作,
# 这里会报错因为重复添加索引
> db.event.ensureIndex({"user_id": 1}, {'unique': true})
# 添加唯一索引,这里会报错因为 user_id 不唯一
> db.event.find({event_id:1}).explain()
# 这时候就能看到 'winningPlan' 里有了查找使用的索引信息
> db.event.dropIndex({'event_id': 1})
# 删除索引

4. aggregate 操作

官方文档
https://docs.mongodb.com/v3.6/reference/operator/aggregation-pipeline/

这里只介绍几种常用操作

$match: 查找条件匹配
$project: 字段筛选, 也可以用来重命名字段
$group: 聚合操作,类似mysql的 group by
$sort: 排序

下面我们结合具体的统计需求进行运用

  • 查找 user_id 为1002的文档,只保留event_id 字段
> db.event.aggregate([
{$match: {"user_id": 1002}},
{$project: {"_id": 0, "event_id": 1}}
{ "event_id" : 1 }
{ "event_id" : 2 }
{ "event_id" : 3 }
  • 分别统计每个event_id的记录总数,按数量由多到少排序
> db.event.aggregate([
{$group: {"_id": "$event_id", count: {$sum: 1}}},
{$project: {"_id": 0, "event_id": "$_id", "count": 1}},
{$sort: {"count": -1}}
{ "count" : 3, "event_id" : 1 }
{ "count" : 1, "event_id" : 3 }
{ "count" : 1, "event_id" : 2 }
                    MongoDB初识——安装连接(centos)https://blog.csdn.net/maxmao1024/article/details/84426836MongoDB入门——增删改查https://blog.csdn.net/maxmao1024/article/details/845286491. 数据准备> use test> db.event.drop()&...
				
我们一般通过表达式$sum来计算总和。因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种: 1,统计符合条件的所有文档的某个字段的总和; 2,统计每个文档的数组字段里面的各个数据值的和。这两种情况都可以通过$sum表达式来完成。 以上两种情况的聚合统计,分别对应与聚合框架中的 $group 操作步骤和 $project 操作步骤。 1.$group 直接看例子吧。 Case 1 测试集合mycol中的数据如下: title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user
{$project:{"age": 1}}, {$group:{"_id": "$age"}}, {$group:{"_id": null, "count": {"$sum": 1}}} 假设数据库中名称是Jone的人有多个,以上聚合结果是,数据库中名字是Jone的人,有多少种不同的年龄。 名叫Jon
最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得。。 别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一下我的总结。 请大家自行查找更多,以下是关键文档。 操作符介绍: $project:包含、排除、重命名和显示字段 $match:查询,需要同find()一样的参数 $li...
案例:mongodb中有统计表(stat_list)表,存有每天的统计数据,现在需要按月计算,则需要用到mongo聚合函数aggregate。 "_id" : ObjectId("5d00d3b66939c1efb80ba325"), "date" : "2019-06-12", "daily_count" : "164.34万", 解决方案: 1、将daily_count去掉万字,然后...
说名:本篇文章开始介绍 aggregate聚合函数)、count() 合计、distinct(去除重复)、$sum(求和操作)、"$unwind"、"$out" 等操作。 MongoDB 聚合操作 MongoDB聚合(aggregate) 主要用于处理数据(诸如统计平均值、求和等),并返回计算后的数据结果。 在使用 RoboMongo 的时候发现获取集合有一种新的方式(两种...
Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析 一:Linq的聚合运算 1. 常见的聚合运算:AggregateCount, Sum, Distinct,Max,Min 这几个聚合运算,我们在sql中看的还是比较多的。 二:Count 1. 这个我们用到的非常多,Count() / LongCount(). 2. LongCount每次都是fore...
索引数组字段,在数组中创建索引,需要对数组中的每个字段依次建立索引。所以在我们为数组 tags 创建索引时,会为 music、cricket、blogs 三个值建立单独的索引。
mongodb执行aggregate操作命令得到结果集,前端页面展示时有时需要做分页这类场景,需要获得结果集的总数。将整个结果集都查询出来往往需要耗费很大网络io和内存。本文介绍一种方法返回经aggregate处理后结果集的记录总数。 对3.4之前的mongodb版本,aggregate的stages并没有提供$count算子返回结果集记录数,可通过如下方式获得,对一个结果集记录中存在的key或...
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory 12245 -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory lixumolin: 解决问题.感谢 MongoDB进阶——高级查询和聚合统计(aggregate) 小博测试成长之路: 能不能指定数据库查询啊 ,像mysql一样 from 数据库名.表名 这种 -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory ITACHI_D_: -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory guangsu.: 点赞是个好习惯 线上事故反思 Rainy Chan: 之前我们公司使用openVPN隔绝,不允许同时操作线上和测试环境,事实证明很有效,因为切线上环境会很小心,密钥是隔离的,需要切换导入 或者线上环境必须在虚拟机里操作