MongoDB介绍及CRUD操作

MongoDB介绍

mongodb属于nosql数据库,是一个文档型数据库,nosql其实是相对于sql数据库而言的。传统的sql数据库存在一系列的问题。比如:需要遵循ACID范式,数据量过大的时候性能下降,不太容易做扩展等问题。nosql则解决了这样的问题
nosql具有以下特点:

  • 简单的数据模型
  • 元数据和数据分离
  • 弱一致性
  • 高吞吐量
  • 高水平扩展能力和低端硬件集群
    mongodb数据库本身就支持数据切片和分布式,非常易于扩展。而且mongodb的数据建模无需事先定义,适用于非强事务性的数据存储场景。

mongodb常用操作:

安装:

  • 通过yum安装
  • 通过rpm包安装
  • 通过编译安装
  • 直接解压二进制文件安装

安装软件类型

  • mongod:mongodb服务启动项
  • mongo:mongodb的shell接口
  • tools:各种数据管理工具

mongodb数据结构介绍

mongodb数据结构有如下几种:

  • db:数据库,对应mysql的db
  • collection:文档集合,对应于mysql的table
  • document:文档,对应于mysql的记录。
    mongodb的document是json格式的数据字串。在往mongodb插入数据的时候不需要实现定义数据库范式,不同document的字段个数也不需要一致。

常用命令

help()        #获取帮助信息
show dbs    #列出当前数据库
show collections    #列出指定库中数据表
show users        #列出用户
show profile    #列出当前数据库所有性能参数
show logs        #列出日志
show log()        #列出指定日志
db.stats()        #列出数据库状态
db.version()       #列出数据库版本
db.serverStatus()    #列出数据库所在服务器状态信息
db.getcollectionNames()    #列出当前库所有collection
db.collection.stats()        #列出当前collection的信息

CRUD操作

> use db_name        #切换和创建数据库,mongodb不需要手动创建数据库,执行此命令其实已经创建数据库了,但是此时show dbs不会显示,只有往db中插入数据才会显示

> db.students.find()    #列出所有document

> db.students.find({age:{$lt: 1}})    #列出age小于1的所有数据

> db.students.find({age:{$lt: 1}}).count()    #统计所有age小于1的数据个数

> db.students.find({age:{$lt:9}}).limit(3)    #仅显示3条age小于9的数据

> db.students.find({age:{$lt:9}}).skip(3)    #显示age小于9的数据,跳过前三条

> db.students.findOne({age:{$lt:9}})    #仅显示一条age小于9的数据

> db.students.find({age:{$in:[10,20]}})    #显示年龄在10到20中间的数据

> db.students.find({$or:[{name:'student15'},{age:10}]})	#查找name为student15或者age为10的用户

> db.students.find({$and:[{name:'student15'},{age:10}]}) #查找name为student15并且age为10的用户

> db.students.find({class:{$exists:true}})	查询存在class字段的文档

> db.studnets.update({name:"tom"},{$set:{age:21}}})    #修改tom的age为21

find操作支持如下高级用法:

  1. 比较操作
  • $gt:大于
  • $gte:大于等于
  • $lt:小于
  • $lte:小于等于
  • $ne:不等于
  • $in:在某个取值范围内
  • $nin:不在某取值范围内
  1. 组合条件查询
  • $or:或
  • $and:与
  • $not:非
  • $nor:异或,返回不符合指定条件的document
  1. 元素查询
  • $exists:返回存在某字段的数据
  • $mod:对指定字段进行取模操作
  • $type:返回指定字段类型为指定类型的文档,语法格式{field:{$type:<BSON type}};1 Double(双精度),2 String,3 Object(对象),Array,Binary data,Undefined,Boolean,Date,Null,Regular Expression,JavaScripy,TimeStamp

注意:每一种数据类型都有一种数字来表示此类型

update常用操作:

  • $set:重置某字段值,语法格式({field:value},{$set:{field:new_value}})
  • $unset:删除某指定字段
  • $rename:对某字段重命名,语法格式({field:value},{$unset:{field1,field2,...}})
  • $inc:增加一个字段的值,实现自增长

删除常用操作:

db.mycoll.remove(<query>,<justOne>)		justOne指定要删除的个数
db.mycoll.remove({age:21})	删除年龄为21的文档
db.mycoll.drop()	删除当前指定coll
db.dropDatabase()	删除库,需要先切换到库中

mongodb的索引

mongodb支持的索引类型:

  • 单字段索引:构建一个字段的索引
  • 组合索引:构建多字段的索引
  • 多键索引:索引创建于子文档的索引
  • 空间索引:基于位置的索引
  • 文本索引:搜索整个文档的文本串
  • hash索引:只适用于精确查找,hash索引不论数据多少,查询速度都是一致的

注意:按照范围查询使用的是树状索引

索引操作命令

db.students.ensureIndex({name:1})    #在name上创建升序索引,1表示升序索引,一般索引名即为字段名,可以通过name来额外指定索引名
db.students.getIndexes()    #获取在students上的所有索引
db.students.dropIndexes()    #删除所有索引
db.students.dropIndex(Index_name)    #删除指定名字索引
db.reIndex()    #重建索引
db.students.find(name:"student5000").explain()    #显示语句的执行过程

索引常用操作:

  • backgroup:true:表示在后台创建索引
  • unique:ture:表示在指定字段创建唯一键索引,不能插入重复值,否则会报错
  • dropDups:true:删除原有相同数据
  • sparse:true:创建稀疏索引

注意:
稀疏索引:多个字段取值共用一个索引项,比如1到5岁的人指向一个索引。索引体积小,但是可能需要做二次查找
稠密索引:每一个字段取值都有一个单独的索引项

mongodb常用服务器选项

常用服务器选项:

  • fork={true|false} mongod是否运行于后台
  • bind_ip=IP 启动之后监听地址
  • port=PORT 监听端口,默认27017,web端口28017
  • maxConns= 最大并发连接数,默认为1000000
  • logpath 日志位置,历史事件日志
  • syslog 由syslog管理日志
  • syslogFacility
  • logappend 是否使用日志滚动
  • keyFile 集群关系认证的私钥文件位置
  • setParameter
  • httpinterface 是否启用内置的web监控接口,默认28017
  • clusterAuthMode 集群认证
  • nounixsocket 是否监听于本地套接字
  • unixSocketPrefix 在哪个路径创建套接字
  • auth={ture|faluse} 是否在数据库级别启用认证功能
  • repair 启动mongodb时先去修复database,进程意外终止导致数据没有同步时使用
  • journal 启用日志功能,保证数据一致性的日志,比较类似事务日志,单实例模型下一定要启用
  • journalCommitInterval 日志提交时间间隔,数据隔一段时间写入硬盘,把随机IO变成顺序IO
  • oplogSize oplog大小,默认为可用磁盘空间5%,最小1G
    调试相关选项:
  • cpu 周期性显示cpu和iowait的利用率信息
  • sysinfo 显示系统级别诊断相关信息
  • slowms 界定慢查询的时间,单位是毫秒
  • profile={0,1,2} 剖析系统问题,0关闭,1慢查询,2剖析所有操作
原文地址:https://www.cnblogs.com/stacks/p/8822127.html