- MongoDB的基本概念
|SQL术语/概念 | MongoDB术语/概念 | 解释/说明
| ------------- | ----------------| -----------------------
| database | database | 数据库
| table | collection | 数据库表/集合
| row | document | 数据记录行/文档
| column | field | 数据字段/域
| index | index | 索引
| table joins | | 表连接,MongoDB不支持
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 2.MongoDB的数据类型 数据类型 | 描述
| String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 | | Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 | | Boolean | 布尔值。用于存储布尔值(真/假)。 | | Double | 双精度浮点值。用于存储浮点值。 | | Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 | | Array | 用于将数组或列表或多个值存储为一个键。 | | Timestamp | 时间戳。记录文档修改或添加的具体时间。 | | Object | 用于内嵌文档。 | | Null | 用于创建空值。 | | Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 | | Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 | | Object ID | 对象 ID。用于创建文档的 ID。 | | Binary Data | 二进制数据。用于存储二进制数据。 | | Code | 代码类型。用于在文档中存储 JavaScript 代码。 | | Regular expression | 正则表达式类型。用于存储正则表达式。
3.创建数据库
use db_name
db
show dbs
如果数据库不存在,则创建数据库,否则切换到指定数据库。查看当前数据库。最后查看所有数据库,发现并没有刚刚创建的数据库,当往数据库插入数据时,数据库才会真实存在。
- 删除数据库
切换到所要删除的数据库下执行
db.dropDatabase()
删除集合(类似数据表)
db.createCollection("name")
db.name.drop()
5.创建集合
db.createCollection(name, options)
# 可选参数, 指定有关内存大小及索引的选项
show collections
show tables
# 查看当前数据库的集合
6.删除集合
db.collection_name.drop()
# 删除当前数据库下,名为collection_name的集合
7.插入文档
db.collection_name.insert(document)
# document文档可视为json格式(字典格式)
document = ({ "title" : "Mongo 教程", "description" : "MongoDB是一个Nosql数据库", "by" : "XXX", "tag" : [ "mongodb", "database", "NoSQL" ] })
# 可以将数据定义为一个变量
db.collection_name.insertOne(document)
# 将一个文档插入集合中
db.collection_name.insertMany([document1,document2])
# 将多个文档插入到集合中
- 更新文档 MongoDB更新文档有两种方法:update() 和 save() 方法
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- query: update的查询条件,类似sql update查询内where后面的。
- update: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
-writeConcern:可选,抛出异常的级别
save()方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
9.删除文档
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- 查询文档
db.collection.find(query, projection)
- query:可选,使用查询操作符指定查询条件
- projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式:
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键
_id 键默认返回,需要主动指定 _id:0 才会隐藏
两种模式不可混用(因为这样的话无法推断其他键是否应返回)
db.collection.find(query, {title: 1, by: 0}) // 错误
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty()
# 会返回json格式的文档
MongoDB 与 RDBMS Where 语句比较
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
| 操作 | 格式 | 范例 | RDBMS中的类似语句 |
|---|---|---|---|
| 等于 | {<key>:<value>} | db.col.find({"key":"value"}).pretty() | where key = value |
| 小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
| 小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
| 大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
| 大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
| 不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
| 其中,大于X且小于Y:{likes : {gt : Y}} |
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
AND 和 OR 联合使用
AND 和 OR 的联合使用,类似常规 SQL 语句为:where key>50 AND (key1 = 'value' OR key2 = 'value')
db.col.find({
{
{key: value}
},//与里面或
{
$or: [
{key1: value1,key2:value2}, {key3:value3}//或里面与
]
}
}
).pretty()
11.MongoDB Limit与Skip方法,类似SQLAlchemy的用法
db.COLLECTION_NAME.find().limit(NUMBER)
# 返回NUMBER条数据
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
# 跳过指定数量的文档,从第一条开始
db.COLLECTION_NAME.find().skip(10).limit(100)
# 读取从 10 条记录后 100 条记录,相当于 sql 中limit (10,100)
12.MongoDB 排序
db.COLLECTION_NAME.find().sort({KEY:1})
# sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
13.MongoDB 索引
索引是对数据库表中一列或多列的值进行排序的一种结构
db.collection.createIndex(keys, options)
# Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
- MongoDB聚合 aggregate() 方法,不加参数和find()一样查找所有的文档,基本语法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。下面是聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。 下面查看管道的工作流程(图片来自MongoDB官方文档):
聚合表达式
| 表达式 | 描述 |
|---|---|
| $sum | 计算总和 |
| $avg | 计算平均值 |
| $min | 获取集合中对应字段值最小的(分组)所有文档 |
| $max | 获取集合中对应字段值最大的(分组)所有文档 |
| $push | 将值加入一个数组中,不会判断是否有重复的值 |
| $addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入 |
| $first | 根据资源文档的排序获取第一个文档数据 |
| $last | 根据资源文档的排序获取最后一个文档数据 |