一、MongoDB简介
1、NoSQL:非关系型数据库。
- NoSQL 有时也称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
- NoSQL 用于超大规模数据的存储。(例如谷歌、Facebook 每天为他们的用户
收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
2、什么是 MongoDB?
- MongoDB是NoSQL的典型代表,用于web的大容量的数据存储。
- MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
- MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
3、常用的术语
SQL术语 | MongDB术语/概念 | 解释/说明 |
---|
database | database | 数据库 | table | collection(集合) | 数据库表/集合 | row | document(文档) | 数据记录行/文档 | column | field(字段) | 数据字段/域 | index | index | 索引 | table join | | 表连接,MongoDB不支持 | primary key | primary key | 主键,MongoDB自动将_id字段设为主键 |
4、数据库
一个 mongodb 中可以建立多个数据库。MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
"show dbs"
数据库也通过名字来标识。数据库名可以是满足以下条件的任意 UTF-8 字符串。
- 不能是空字符串(“”)。
- 不得含有’ '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多 64字节。
5、文档
需要注意的是:
(1) 文档中的键/值对是有序的。 (2) 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。 (3) MongoDB 区分类型和大小写。 (4) MongoDB 的文档不能有重复的键。 (5) 文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。
文档键命名规范:
(1) 键不能含有\0 (空字符)。这个字符用来表示键的结尾。 (2) .和$有特别的意义,只有在特定环境下才能使用。 (3) 以下划线"_"开头的键是保留的,例如:默认的主键_id.(不是严格要求的)
6、集合
- 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
- 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
??比如,我们可以将以下不同数据结构的文档插入到集合中 当第一个文档插入时,集合就会被创建。
合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有\0 字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
7、MongoDB 数据类型
数据类型 | 描述 |
---|
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 | 正则表达式类型。用于存储正则表达式。 |
二、MongoDB的基本操作
1、db:是MongoDB的默认数据库。
用户可以创建多个数据库。
2、创建数据库
use DATABASE_NAME
3、删除数据库
db.dropDatabase()
db
4、创建集合(表)
db.createCollection(name, options)
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
db.mycol2.insert({"name" : "张三"})
show collections
5、删除集合(表)
db.集合名.drop()
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false
6、插入文档
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}])
7、查询文档
(1)查询操作符
查询操作符 | 说明 |
---|
$lt | 小于 | $gt | 大于 | $or | 或 | $in | 表示某个集合中 | $size | 用来统计记录数 | $all | 表示所有 |
(2)常用函数:
常用函数 | 说明 |
---|
sort({字段:1/-1}) | 1表示升序,-1表示降序 | distinct(字段) | 表示某个字段的覆盖范围 | limit() | 分页查询 |
??举个例子: 前提:创建集合为classes,如下所示
db.createCollection("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({})
db.classes.find({age:8})
db.classes.find({age:{$gt:10})
db.classes.find({age:{$in:[8,9,10,11,12]}})
db.classes.find({age:8,hobby:'画画',sex:'男'})
db.classes.find({$or:[{age:{$lt:8}},{age:{$gt:12}}]})
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)
8、更新文档
(1)updateOne():更新一条记录
更新操作符 | 说明 |
---|
$set | 设置新的值 | $push | 追加一个内容 | $pushAll | 追加多个内容 | $addToSet | 增加内容并且设置增加的条件 | $each | 用于查找。和$addToSet联合使用时表示若存在则不添加,若不存在则添加 | $inc | 用于字段值的增加 | $unset | 删除某个字段 | $pop | 删除某个字段的第一个值 |
(2)updateMany():更新所有记录
更新语句如下:
db.classes.updateOne({name:'小红'},{$set:{age:8,hobby:['跳舞','画画']}})
db.classes.find({name:'小红'})
db.classes.find({name:'小明'})
db.classes.updateOne({name:'小明'},{$push:{hobby:'唱歌'}})
db.classes.updateOne({name:'小王'},{$pushAll:{hobby:['吹牛','打篮球']}}})
db.classes.find({name:'小王'})
db.classes.find({name:'小李'})
db.classes.updateOne({name:'小李'},{$addToSet:{$each:['跑步','唱歌']}}})
db.classes.updateMany({},{$inc:{age:1}})
db.classes.find({})
db.classes.updateOne({name:'小明'},{$unset:{sex:""}})
db.classes.find({name:'小明'})
db.classes.updateOne({name:'小李'},{$pop:{hobby:-1}})
db.classes.find({name:'小王'})
db.classes.updateOne({name:'小王'},{$set:{备注:{民族:'回族',习俗:'不吃猪肉'}}})
db.classes.updateOne({name:'小王'},{$Set:{宗教:'伊斯兰教'}}})
9、删除文档
(1)deleteMany():删除所有记录
(2)deleteOne():删除某个记录
|