文章目录
- NoSQL
- MongoDB简介
- MongoDB安装
- MongoDB连接服务器
- 命令
- 创建集合
- 查询
- 查询集合中的文档db.集合名称.find({条件})
- 查询集合中的文档,返回某些特定的键值:db.集合名称.find({},{key1:1,key2:true,key3:0,key4:false})
- 查询集合中的文档,使用条件表达式(<,<=,>,>=,!=)
- 查询集合中的文档,统计(count)、排序(sort)、分页(skip,limit)
- 查询集合中的文档,$all主要用来查询数组中的包含关系,查询条件中只要有一个不包含就不返回
- 查询集合中的文档,$in,类似于关系型数据库中的IN
- $nin,与$in相反
- 查询集合中的文档,$or,相当于关系型数据库中的OR,表示或者的关系,例如查询name为user2或者age为20的文档,命令为:
- 查询集合中的文档,$exists,用于查询集合中存在某个键的文档或不存在某个键的文档,例如查询user集合中存在address键的所有文档可以使用db.user.find({address:{$exits:1}})
- 查询集合中的文档,类似于关系型数据库,mongodb中也有游标的概念
- 更新
NoSQL
NoSQL = Not Only SQL(非关系型数据库)
关系型数据库
关系型数据库中的表都是存储一些格式化的数据结构,每条记录的字段的组成都一样,即使不是每条记录都需要所有的字段,但数据库会为每条数据分配所有的字段。
关系型数据库:database table row filed
User(id name age)
±-------------------------
1 jack 10
2 rose 20
非关系型数据库
非关系型数据库以键值对(key——value)存储,它的结构不固定,每一条记录可以有不一样的键,每条记录可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。
非关系型数据库:database collection document json(key-value)
collection:User
{id:1,name:“jack”,age:10}
{id:2,address:“bj”}
常见的Nosql数据库
CouchDB 目前国内外正在应用NoSQL的网站有:
Redis 新浪微博 Redis
MongoDB Google Bigtable
Neo4j Amazon SimpleDB
HBase 淘宝数据平台 Tair
BigTable 视觉中国网站 MongoDB
优酷运营数据分析 MongoDB
飞信空间 HandlerSocket
豆瓣社区 BeansDB
优缺点
优势
- 简单的扩展
- 快速的读写
- 低廉的成本
- 灵活的数据模型
缺点
- 不提供对SQL的支持
- 支持的特性不够丰富
- 现有的产品不够成熟
- 不支持事务
MongoDB简介
- 文档(document)是MongoDB中数据的基本单元,非常类似于关系型数据库中的行(但比行要复杂的多)
- 集合(collection)就是一组文档,如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表
- MongoDB的单个实例可以容纳多个独立的数据库,每个数据库都有自己的集合和权限
- MongoDB自带简介但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据作用非常大
- 每个文档都有一个特殊的键“_id",它在文档所处的集合中是唯一的,相当于关系型数据库的表的主键。
基本数据类型
- null:用于表示空值或者不存在的字段,{“x”:null}
- 布尔型:布尔类型有两个值true和false,{“x”:true}
- 数值:shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
- 字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}
- 日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}
- 正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”?[abc]/}
- 数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]}
- 内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}
- 对象Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() }
- 二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非utf-字符保存到数据库中,二进制数据是唯一的方式。
- 代码:查询和文档中可以包括任何JavaScript代码,{“x”:function(){/…/}}
MongoDB安装
- 在官网下载https://www.mongodb.com/download-center/community
- 解压之后在系统环境变量path中配置bin的目录
- 输入monggo出来命令说明配置成功
- 接着启动服务,新建一个名叫monggo.bat的文件,里面的内容为:mongod --dbpath=你自己的数据库存放地点,我的是mongod --dbpath=E:\NoSQL\mongodb-4.0.9\data
- 点击运行如同
MongoDB连接服务器
在命令行中可以使用mongo命令连接到MongoDB服务器,如下,输入mongo命令默认连接到本地的名称为test的数据库,如果希望连接到远程数据库,可以使用mongo ip:port(端口号)
命令
作用 | 命令 |
---|---|
查看目前使用的数据库 | db |
创建数据库(如果数据库存在就进入数据库,如果不存在就创建,也叫做隐式创建 ) | use 数据库名称 |
删除当前数据库 | db.dropDatabase() |
查看所有数据库 | show dbs |
查看当前所在数据库 | db |
查看当前数据库中所有的集合 | show collections/show tables |
删除集合 | db.集合名称.drop() |
向集合添加文档 | db.集合名称.insert({key:value,...}) |
删除集合中的文档 | db.集合名称.remove({删除条件}),不加删除条件为删除集合中所有文档 |
创建集合
两种方式 显示创建和隐式创建
显示创建可以使用命令db.createCollection(“集合名称”)
隐式创建可以使用命令db.集合名称.insert({}),指创建集合并同时向集合中插入数据,例如db.customer.insert({name:“jack”})
查询
查询集合中的文档db.集合名称.find({条件})
查询集合中的文档,返回某些特定的键值:db.集合名称.find({},{key1:1,key2:true,key3:0,key4:false})
key1键值,key2键值显示
除key3,key4外显示
查询集合中的文档,使用条件表达式(<,<=,>,>=,!=)
//大于:field>value
db.collection.find({field:{$gt:value}});
//小于:field<value
db.collection.find({field:{$lt:value}});
//大于等于:field>-value
db.collection.find({field:{$gte:value}});
//小于等于:field<=value
db.collection.find({field:{$lte:value}});
//不等于:field!=value
db.collection.find({field:{$ne:value}});
查询集合中的文档,统计(count)、排序(sort)、分页(skip,limit)
db.集合名.count();
db.集合名.find().count();
db.集合名.find({age:{$lt:5}}).count();
db.集合名.find().sort({age:1}) ;
db.集合名.find().skip(2),limit(3);
skip代表跳过几个,limit代表到几
db.集合名.find().sort({age:-1}).skip(2).limit(3);
db.集合名.find().sort({age:-1}).skip(2).limit(3).count();
count由参数如果不写默认为0,并且count默认为统计find()的值,不看后面的skip,limit,sort
db.集合名.find().sort({age:-1}).skip(2).limit(3).count(0);
db.集合名.find().sort({age:-1}).skip(2).limit(3).count(1);
当参数为1时,那么查出来多少,结果为多少。
查询集合中的文档,$all主要用来查询数组中的包含关系,查询条件中只要有一个不包含就不返回
查询集合中的文档,$in,类似于关系型数据库中的IN
有一个就能查出来
n i n , 与 nin,与 nin,与in相反
查询集合中的文档,$or,相当于关系型数据库中的OR,表示或者的关系,例如查询name为user2或者age为20的文档,命令为:
db.user.find({$or:[{name:“user2”},{age:20}]})
查询集合中的文档,KaTeX parse error: Expected '}', got 'EOF' at end of input: …find({address:{exits:1}})
$exists:1表示真,指存在
$exists:0表示假,指不存在
查询集合中的文档,类似于关系型数据库,mongodb中也有游标的概念
更新
更新集合中的文档语法如下:
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
criteria:用于设置查询条件的对象
objNew:用于设置更新内容的对象
upsert:如果记录已经存在,更新它,否则新增一个记录,取值为0或1
multi:如果有多个符合条件的记录,是否全部更新,取值为0或1
注意:默认情况下,只会更新第一个符合条件的记录一般情况下后两个参数分别为0,1,即:
db.collection.update(criteria,objNew,0,1)
$set
更新集合中的文档,KaTeX parse error: Expected '}', got 'EOF' at end of input: …name:"user1"},{set:{address:“bj”}},0,1)
将name为user1的文档修改address为tj,其他键值对不变,命令为
db.c1.update({name:user1"},{$set:{address.“tj”}},0,1)
$inc
使用 i n c 将 几 何 中 n a m e 为 u s e r 1 的 a g e 加 1 , 其 他 键 不 变 , inc将几何中name为user1的age加1,其他键不变, inc将几何中name为user1的age加1,其他键不变,inc表示使某个键值加减指定的数值
$unset
KaTeX parse error: Expected '}', got 'EOF' at end of input: …name:"user1"},{unset:{address:1}},0,1)也可以写成address:true