mongo 基础命令二$type,聚合和索引

一、$type

场景:基于类型的查询,比如查询时同一个字段类型不同时,可以使用
测试:构造数据

db.col.insert({
	title: 'PHP',
	description: 'php是一种创建动态交互性站点强有力的服务器端脚本语言',
	by: 'zhangsan',
	url: 'http://www.baizhi.com',
	tags: ['php'],
	likes:200
});

db.col.insert({
	title: 'Java',
	description: 'Java是一种高级程序设计语言',
	by: 'zhangsan',
	url: 'http://www.baizhi.com',
	tags: ['Java'],
	likes:550
});
db.col.insert({
	title: 'MongoDB',
	description: 'MongoDB是一种Nosql数据库',
	by: 'zhangsan',
	url: 'http://www.baizhi.com',
	tags: ['MongoDB'],
	likes:100
});
db.col.insert({
	title: '2233',
	description: '2233飒飒',
	by: 'zhangsan',
	url: 'http://www.baizhi.com',
	tags: ['2233'],
	likes:100
});

查询:
1、等值查询likes为200的 :

db.col.find({likes:200}).pretty()

2、查询title为string类型的数据:

db.col.find({title:{$type:2}}).pretty() | db.col.find({title:{$type:'string'}}).pretty()

3、查询title为数字类型的数据:

db.col.find({title:{$type:1}}).pretty() | db.col.find({title:{$type:'double'}}).pretty()
默认情况,mongo中整数或小数以double类型构建,查询时以1查询

4、查询tag为数组类型的数据:

db.col.find({tags:{$type:'array'}}).pretty() | db.col.find({tags:{$type:4}}).pretty()

二、索引使用

1) mongo索引:

  • 提高查询效率
  • 若无索引,mongo读数据时,必须扫描集合中的每个文件,并选取那些符合查询条件的记录
  • 索引是特殊的数据结构,存储在一个易于遍历读取的数据集合中
  • 索引是对数据库表中的一列或者多列的值进行排序的结构
  • 查询时有索引,会优先利用索引查询

2) 创建:

db.集合名称.createIndex(keys, options)
key为要创建的索引,1 为指定按升序创建的索引, -1为降序,可为多个字段创建索引
db.集合名称.createIndex({title:1, description:-1})

给name创建索引:

db.users.createIndex({name:1})

-- 创建age索引,并指定名字age_index
db.users.createIndex({age:1},{name:'age_index'})

查看创建的索引

db.users.getIndexes()

索引有效期 expireAfterSeconds 单位是秒

db.users.createIndex({name:1},{name:'name_index', expireAfterSeconds:15});

其他参数还有:

指定索引版本 v
以后台方式创建索引 background : true
建立唯一索引 unique:true

复合索引创建(由多个字段共同维护):

db.users.createIndex({name:1,age:-1},{name:"name_age_index"})

db.users.getIndexes()

一个索引的值由多个key进行维护的索引称为复合索引,mongodb中复合索引和关系型数据库一致都是左前缀原则

如:
{a:1}
{a:1,b:1}
{a:1,b:1,c:1}

当搜索的字段包含了复合索引的全部字段,但是他们的顺序不同,也可以利用索引,mongo和mysql引擎一样会动态调整字段顺序
如bac,cab,bca,abc等等都可以利用索引,

3) 删除索引,删除所有时不包含_id

db.集合名称.dropIndexes() # 删除所有索引
db.集合名称.dropIndex('name_index') # 删除指定索引

4) 返回索引所占的总大小, 返回字节

db.users.totalIndexSize()

三、聚合

db.集合名称.aggregate([{$group:{_id:"$by_user", num_tutorial:{$sum:1}}}])
按by_user分组,执行求和操作

1) 聚合案例:

db.tets.aggregate([{$group:{_id:"$by_user"}}])

$sum:0表示不聚合,1时聚合求和,2,3时会乘以1聚合后的结果

> db.tets.aggregate([{$group:{_id:"$by_user",sum_by_user:{$sum:0}}}])
{ "_id" : "runoob.com", "sum_by_user" : 0 }
{ "_id" : "Neo4j", "sum_by_user" : 0 }

> db.tets.aggregate([{$group:{_id:"$by_user",sum_by_user:{$sum:1}}}])
{ "_id" : "runoob.com", "sum_by_user" : 2 }
{ "_id" : "Neo4j", "sum_by_user" : 1 }

> db.tets.aggregate([{$group:{_id:"$by_user",sum_by_user:{$sum:2}}}])
{ "_id" : "Neo4j", "sum_by_user" : 2 }
{ "_id" : "runoob.com", "sum_by_user" : 4 }


> db.tets.aggregate([{$group:{_id:"$by_user",sum_by_user:{$sum:3}}}])
{ "_id" : "runoob.com", "sum_by_user" : 6 }
{ "_id" : "Neo4j", "sum_by_user" : 3 }

2) 其他参数:
计算平均值: $avg
获取最小值: $min
获取最大值: $max
将值加入一个数组,不会判断是否有重复值: $push
将值加入一个数组,会判断是否有重复值,若值已存在,则不会添加: $addToSet
根据资源文档排序获取第一个文档数据: $first
根据资源文档排序获取最后一个文档数据: $last

> db.tets.aggregate([{$group:{_id:"$by_user",avg_by_user:{$avg:'$likes'}}}])
{ "_id" : "runoob.com", "avg_by_user" : 55 }
{ "_id" : "Neo4j", "avg_by_user" : 750 }


> db.tets.aggregate([{$group:{_id:"$by_user",push_by_user:{$push:'$url'}}}])
{ "_id" : "runoob.com", "push_by_user" : [ "http://www.runoob.com", "http://www.runoob.com" ] }
{ "_id" : "Neo4j", "push_by_user" : [ "http://www.neo4j.com" ] }


> db.tets.aggregate([{$group:{_id:"$by_user",addtoset_by_user:{$addToSet:'$url'}}}])
{ "_id" : "runoob.com", "addtoset_by_user" : [ "http://www.runoob.com" ] }
{ "_id" : "Neo4j", "addtoset_by_user" : [ "http://www.neo4j.com" ] }
posted @   鱼的记忆·  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示