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" ] }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)