- NoSQL 有时也称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
- NoSQL 用于超大规模数据的存储。(例如谷歌、Facebook 每天为他们的用户
收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
- MongoDB是NoSQL的典型代表,用于web的大容量的数据存储。
- MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
- MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
SQL术语 | MongDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection(集合) | 数据库表/集合 |
row | document(文档) | 数据记录行/文档 |
column | field(字段) | 数据字段/域 |
index | index | 索引 |
table join | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设为主键 |
一个 mongodb 中可以建立多个数据库。MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
"show dbs"// 命令可以显示所有数据库的列表。
数据库也通过名字来标识。数据库名可以是满足以下条件的任意 UTF-8 字符串。
- 不能是空字符串(“”)。
- 不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多 64字节。
需要注意的是:
(1) 文档中的键/值对是有序的。
(2) 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
(3) MongoDB 区分类型和大小写。
(4) MongoDB 的文档不能有重复的键。
(5) 文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。
文档键命名规范:
(1) 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
(2) .和$有特别的意义,只有在特定环境下才能使用。
(3) 以下划线"_"开头的键是保留的,例如:默认的主键_id.(不是严格要求的)
- 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
- 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
❤️比如,我们可以将以下不同数据结构的文档插入到集合中
当第一个文档插入时,集合就会被创建。
合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有\0 字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
数据类型 | 描述 |
---|---|
Object ID | 对象 ID。用于创建文档的 ID。 |
String | 字符串 。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。 记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
用户可以创建多个数据库。
use DATABASE_NAME
db.dropDatabase()
db //db这个命令可以查看当前数据库名字是啥
db.createCollection(name, options)
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
db.mycol2.insert({"name" : "张三"})
show collections
db.集合名.drop()
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false
db.COLLECTION_NAME.insert(document)
insert(): 若插入的数据主键已经存在,则会抛org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
3.2 版本后还有以下几种语法可用于插入文档:
- db.collection.insertOne():向指定集合中插入一条文档数据
- db.collection.insertMany():向指定集合中插入多条文档数据
# 插入单条数据
var document = db.collection.insertOne({"a": 3})
# 插入多条数据
var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
(1)查询操作符
查询操作符 | 说明 |
---|---|
$lt | 小于 |
$gt | 大于 |
$or | 或 |
$in | 表示某个集合中 |
$size | 用来统计记录数 |
$all | 表示所有 |
(2)常用函数:
常用函数 | 说明 |
---|---|
sort({字段:1/-1}) | 1表示升序,-1表示降序 |
distinct(字段) | 表示某个字段的覆盖范围 |
limit() | 分页查询 |
☀️举个例子:
前提:创建集合为classes,如下所示
db.createCollection("classes");
// ----------------------------
// Documents of classes
// ----------------------------
db.getCollection("classes").insert([ {
_id: ObjectId("60fa23b7f0ca97d65028f909"),
name: "乔峰",
age: NumberInt("28"),
sex: "男",
hobby: [
"足球",
"武术",
"乒乓球"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa23b7f0ca97d65028f90c"),
name: "段誉",
age: NumberInt("25"),
sex: "男",
hobby: [
"舞蹈",
"武术",
"篮球"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa24a9f0ca97d65028f934"),
name: "虚竹",
age: NumberInt("23"),
sex: "男",
hobby: [
"舞蹈",
"化妆",
"游泳"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa24a9f0ca97d65028f937"),
name: "令狐冲",
age: NumberInt("25"),
sex: "男",
hobby: [
"喝酒",
"武术",
"爬山"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa24a9f0ca97d65028f93a"),
name: "任盈盈",
age: NumberInt("23"),
sex: "女",
hobby: [
"舞蹈",
"化妆",
"武术"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa24a9f0ca97d65028f93d"),
name: "向问天",
age: NumberInt("32"),
sex: "男",
hobby: [
"武术",
"喝酒",
"足球"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa24a9f0ca97d65028f940"),
name: "灵儿",
age: NumberInt("12"),
sex: "女",
hobby: [
"舞蹈",
"计算机",
"游泳",
"看书"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa24fdf0ca97d65028f952"),
name: "阿宝",
age: NumberInt("8"),
sex: "男",
hobby: [
"舞蹈",
"画画",
"游泳"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa26b6f0ca97d65028f99e"),
name: "小明",
age: NumberInt("8"),
sex: "男",
hobby: [
"跆拳道",
"二胡",
"游泳"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa26b6f0ca97d65028f9a1"),
name: "小明",
age: NumberInt("8"),
sex: "男",
hobby: [
"跆拳道",
"画画"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa26b6f0ca97d65028f9a4"),
name: "小红",
age: NumberInt("9"),
sex: "女",
hobby: [
"乒乓球",
"唱歌",
"游泳",
"画画"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa26b6f0ca97d65028f9a7"),
name: "田娃",
age: NumberInt("11"),
sex: "男",
hobby: [
"跑步",
"计算机",
"画画"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa26b6f0ca97d65028f9aa"),
name: "嘎子",
age: NumberInt("12"),
sex: "男",
hobby: [
"跆拳道",
"二胡",
"游泳"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa2733f0ca97d65028f9c2"),
name: "小王",
age: NumberInt("10"),
sex: "男",
hobby: [
"读书",
"二胡"
]
} ]);
db.getCollection("classes").insert([ {
_id: ObjectId("60fa2733f0ca97d65028f9c5"),
name: "小李",
age: NumberInt("12"),
sex: "男",
hobby: [
"画画",
"读书",
"羽毛球",
"爬山"
]
} ]);
查找语句如下:
db.getCollection('classes').find({})
//查询年龄为8岁的人员信息
db.classes.find({age:8})
//查询年龄大于10岁的信息
db.classes.find({age:{$gt:10})
//查询年龄在8-12岁信息
db.classes.find({age:{$in:[8,9,10,11,12]}})
//查看年龄8岁且喜欢画画的男生信息
db.classes.find({age:8,hobby:'画画',sex:'男'})
//查看年龄小于8岁或者大于12岁的人员信息
db.classes.find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
//查看年龄9岁或者11岁的学生
db.classes.find({$or:[{age:9},{age:11}]})
//查找右两个兴趣的学生
db.classes.find({hobby:{$size:2}})
//查找喜欢计算机的学生
db.classes.find({hobby:'计算机'})
//查找既喜欢画画有喜欢跳舞的学生
db.classes.find({hobby:'画画',hobby:'跳舞'})
db.classes.find({hobby:{$all:['画画','跳舞']}})
//查找班级中年龄第二大的同学
db.classes.find().sort({age:-1})[1]
//查询班级同学兴趣爱好所覆盖的范围
db.classes.distinct('hobby')
//查找班级年龄中年龄最小的三位同学
db.classes.find().sort({age:1}).limit(3)
(1)updateOne():更新一条记录
更新操作符 | 说明 |
---|---|
$set | 设置新的值 |
$push | 追加一个内容 |
$pushAll | 追加多个内容 |
$addToSet | 增加内容并且设置增加的条件 |
$each | 用于查找。和$addToSet联合使用时表示若存在则不添加,若不存在则添加 |
$inc | 用于字段值的增加 |
$unset | 删除某个字段 |
$pop | 删除某个字段的第一个值 |
(2)updateMany():更新所有记录
更新语句如下:
//更新操作
//(1)将小红年龄改为8岁,兴趣爱好改成跳舞画画
db.classes.updateOne({name:'小红'},{$set:{age:8,hobby:['跳舞','画画']}})
db.classes.find({name:'小红'})
//(2)追加小明的兴趣爱好
db.classes.find({name:'小明'})
db.classes.updateOne({name:'小明'},{$push:{hobby:'唱歌'}})
//(3)给小王的爱好的爱好增加吹牛和打篮球多个爱好
db.classes.updateOne({name:'小王'},{$pushAll:{hobby:['吹牛','打篮球']}}})
db.classes.find({name:'小王'})
//(4)小李兴趣要增加跑步唱歌,但是不能和已有的一样
db.classes.find({name:'小李'})
db.classes.updateOne({name:'小李'},{$addToSet:{$each:['跑步','唱歌']}}})
//(5)班级中的所有人年龄加1
db.classes.updateMany({},{$inc:{age:1}})
db.classes.find({})
//(6)删除小明的sex属性
db.classes.updateOne({name:'小明'},{$unset:{sex:""}})
db.classes.find({name:'小明'})
//(7)小李第一个兴趣爱好不要了
db.classes.updateOne({name:'小李'},{$pop:{hobby:-1}})
//(8)给小王增加一个域:备注:{民族:”回族“,习俗:”不吃猪肉“}
db.classes.find({name:'小王'})
db.classes.updateOne({name:'小王'},{$set:{备注:{民族:'回族',习俗:'不吃猪肉'}}})
//(9)修改小王的备注域,增加项:宗教:‘伊斯兰教’
db.classes.updateOne({name:'小王'},{$Set:{宗教:'伊斯兰教'}}})
(1)deleteMany():删除所有记录
(2)deleteOne():删除某个记录