如果不是因为比赛,我可能会好久都不会知道它的存在
既然不会,就要在第一时间弄懂它
NoSQL基础概念
什么是NOSQL?
NoSQL最常见的解释是“non-relational”,即非关系型的,当然 “Not Only SQL”(不仅仅是SQL)也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。
NoSQL数据库类型
NOSQL主要有四种数据类型,分别是键值数据库
,列存储数据库
,文档数据库
和图形数据库
。
分类 | 相关软件产品 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
NoSQL优点
-
大数据量,高性能
大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。
-
灵活的可扩展性
NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。
-
灵活的数据模型
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。
-
高可用
NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用。
MongoDB环境安装
1.下载MongoDB数据库,地址:MongoDB Community Server
2.下载MongoDB Shell工具,地址:MongoDB Shell
3.安装MongoDB后,进入MongoDB根目录下的 bin
目录下,把MongoDB Shell工具中的bin目录下的所有文件放置MongoDB数据库bin目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8A5g2eV-1693294381868)(./assets/image-20230823232234932.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UFDcyRht-1693294381869)(./assets/image-20230823234254970.png)]
设置环境变量,点击path -> 编辑 -> 新建,将MongoDB
bin目录路径写入之新建路径中,并依次点击确定即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7PsBIb31-1693294381869)(./assets/image-20230823234501675.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfXIDNiv-1693294381870)(./assets/image-20230823234610681.png)]
打开cmd
,输入mongosh localhost:27017
,出现下图内容,即可代表Mongodb
环境配置成功!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGxs6DAy-1693294381870)(./assets/image-20230823233805803.png)]
相关语法
以最常见的MongoDB为例,下面只显示一部分相关命令。如需了解具体命令,请自行查阅相关技术文档。
查看数据库命令
test> show dbs;
admin 40.00 KiB
config 108.00 KiB
local 72.00 KiB
nosql 72.00 KiB
使用数据库
test> use nosql;
switched to db nosql
当前数据库
test> db;
nosql
删除当前使用数据库
test> db.dropDatabase();
{ ok: 1, dropped: 'nosql' }
查看集合(相当于看表)
nosql> show collections;
user
或
nosql> show tables;
user
创建一个集合(相当于创建表)
nosql> db.createCollection("user");
{ "ok" : 1 }
nosql> show tables;
user
插入一个文档(相当于向表中插入数据)
nosql> db.user.insert({uid:1,name:'hjhk',age:23,mail:'hjhk@mail.com'});
条件查询
下面是MongoDB内置的操作符,通过以下操作符,即可实现特定查询
查询所有数据
nosql> db.user.find();
[
{
_id: ObjectId("64e62cc5a0c2a1db4a832688"),
uid: 1,
name: 'hjhk',
age: 23,
mail: 'hjhk@mail.com'
},
{
_id: ObjectId("64e62d36a0c2a1db4a832689"),
uid: 2,
name: 'rgrd',
age: 17,
mail: 'rgrd@mail.com'
},
{
_id: ObjectId("64e62d55a0c2a1db4a83268a"),
uid: 3,
name: 'ttfg',
age: 34,
mail: 'ttfg@mail.com'
}
]
查询uid为1的文档
nosql> db.user.find({"uid":1});
或
nosql> db.user.find({"uid":{$eq:1}});
[
{
_id: ObjectId("64e62cc5a0c2a1db4a832688"),
uid: 1,
name: 'hjhk',
age: 23,
mail: 'hjhk@mail.com'
}
]
查询字段uid的值大于2的文档
nosql> db.user.find({"uid":{$gt: 2}});
[
{
_id: ObjectId("64e62d55a0c2a1db4a83268a"),
uid: 3,
name: 'ttfg',
age: 34,
mail: 'ttfg@mail.com',
password: 'rdgdw'
}
]
查询uid字段值除以2等于0的文档
nosql> db.user.find({"uid":{$mod:[2,0]}});
[
{
_id: ObjectId("64e62d36a0c2a1db4a832689"),
uid: 2,
name: 'rgrd',
age: 17,
mail: 'rgrd@mail.com',
password: 'efsgdww'
}
]
查询name不等于1的数据
nosql> db.user.find({ "name": { $ne: 1 } });
[
{
_id: ObjectId("64e62cc5a0c2a1db4a832688"),
uid: 1,
name: 'hjhk',
age: 23,
mail: 'hjhk@mail.com',
password: '213243434'
},
{
_id: ObjectId("64e62d36a0c2a1db4a832689"),
uid: 2,
name: 'rgrd',
age: 17,
mail: 'rgrd@mail.com',
password: 'efsgdww'
},
{
_id: ObjectId("64e62d55a0c2a1db4a83268a"),
uid: 3,
name: 'ttfg',
age: 34,
mail: 'ttfg@mail.com',
password: 'rdgdw'
}
]
查询name和password都不为1的数据
nosql> db.user.find({$and:[{"name":{$ne:1}},{"password":{$ne:1}}]});
[
{
_id: ObjectId("64e62cc5a0c2a1db4a832688"),
uid: 1,
name: 'hjhk',
age: 23,
mail: 'hjhk@mail.com',
password: '213243434'
},
{
_id: ObjectId("64e62d36a0c2a1db4a832689"),
uid: 2,
name: 'rgrd',
age: 17,
mail: 'rgrd@mail.com',
password: 'efsgdww'
},
{
_id: ObjectId("64e62d55a0c2a1db4a83268a"),
uid: 3,
name: 'ttfg',
age: 34,
mail: 'ttfg@mail.com',
password: 'rdgdw'
}
]
更新/修改数据
#把字段age为25时的数据中的name更改为xiaoli
db.user.update({age: 23}, {$set: {name:'xiaoli'}}, false, true);
相当于:update users set name = 'changeName' where age = 25;
#把字段name为rgrd时的数据中的age数值增加20
db.user.update({name: 'rgrd'}, {$inc: {age: 20}}, false, true);
相当于:update users set age = age + 20 where name = 'rgrd';
#把字段name为ttfg时的数据中的age数值增加10并把name更改为xiaogang
db.user.update({name: 'ttfg'}, {$inc: {age: 10}, $set: {name: 'xiaogang'}}, false, true);
相当于:update users set age = age + 10, name = 'xiaogang' where name = ‘ttfg';
条件删除
db.users.remove({age: 23});
删除当前聚集集合(即删除当前表)
db.nosql.drop()