MongoDB作为最像关系型数据的非关系型数据库,有许多类似SQL的功能,他是一个基于分布式文件储存的数据库,由C++编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB的主要特点:
- MongoDB 的提供了一个面向文档存储,操作起来比较简单和容易。
- 你可以在 MongoDB记录中设置任何属性的索引( 如 : FirstName=“Sameer”, Address=“8 Gandhi Road”)来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得 MongoDB 有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- Mongo 支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻 易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些 指定的数据字段 。
- Mongodb 中的 Map/reduce 主要是用来对数据进行批量处理和聚合操作。
- Map 和 Reduce。Map 函数调用 emit(key,value)遍历集合中所有的记录, 将 key与value 传给 Reduce 函数进行处理。
- Map函数和 Reduce函数是使用Javascript 编写的 , 并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB 支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP, C#等多种语言。
- MongoDB 安装简单。
MongoDB术语/概念与SQL区别:
SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接, MongoDB 不支持 | |
primary key | primary key | 主键, MongoDB 自动将_id 字 段设置为主键 |
MongoDB中数据库基本操作
展示所有数据库列表:
show dbs
创建数据库:
use database_name
,会创建数据库并切换至该数据库
显示所在数据库:
db
删除数据库:
先进入想要删除的数据库,然后输入db.dropDatabase()
MongoDB集合(数据库表)
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关 联性。
创建集合:
1、创建数据库后,直接在数据中添加数据可自动创建相应集合
2、db.createCollection(name,options)
,name表示要创建的集合名,options是可选参数,指定有关内存大小及索引的选项。
options可选参数如下:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的 集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
查看已有集合:
show collections/show tables
删除集合:
db.collection.drop()
MongoDB文档(数据记录行)
MongoDB文档时一组键值(key-value)对(BSON),例如{“name”:“xiaowang”,“age”:18}
文档不需要设置相同的字段,相同的字段不需要相同的数据类型,这是其区别于关系型数据库很重要的一点,也是MongoDB的特点。
MongoDB需要注意的点:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据 类型(甚至可以是整个嵌入的文档)。
- MongoDB 区分类型和大小写。
- 文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。 文档键命名规范: 1、 键不能含有\0 (空字符)。这个字符用来表示键的结尾。 2、.和$有特别的意义,只有在特定环境下才能使用。 3、 以下划线"_"开头的键是保留的(不是严格要求的)。
和其他数据库一样,我们大部分时间都是在操作MongoDB文档,MongoDB的增删改查:
增
MongoDB使用insert()或save()方法向集合中插入文档,语法如下
db.collection_name.insert(document)
例:
db.classes.insert({"class":"python","name":"小王"})
db.collection_name.save(document)
,save()方法如果不加_id字段和insert()方法一样,但是如果添加了_id字段,且没有该_id字段,会插入一条新数据,如果集合中已经存在该字段,会更新该字段的数据。
例:
db.classes.save({"_id":100,"class":python,"name":"小黄"})
删
db.collection_name.remove(query,justOne,writeConcern)
,其中query为删除条件。
justOne可选,如果设置为ture或者1,会删除第一条符合条件的文档,默认为false,全部删除。
writeConcern可选,代表抛出异常的级别。
例:
db.test.remove({age:19},true)
改
我们已经知道当save()方法中有已存在的_id,会修改该文档数据,MongoDB中还有一个修改的方法update()
db.collection_name.update(query,update,upsert,multi,writeConcern)
参数说明:
query:修改条件
update:需要进行更新的操作
upsert:可选参数,设置成true,如果修改条件不存在会添加,默认为false,不添加
multi:可选参数,默认为false,只更新找到的第一条数据,设置成true会修改所有符合条件的数据
writeConcern:可选参数,抛出异常的级别
更新操作符:
- $currentDate 将字段的值设置为当前日期,可以是Date或Timestamp。
- $inc 按指定的数量增加字段的值。
- $min 仅当指定的值小于现有字段值时才更新字段。
- $max 仅当指定的值大于现有字段值时才更新字段。
- $mul 将字段的值乘以指定的量。
- $rename 重命名字段。
- $set 设置文档中字段的值。
- $setOnInsert 如果更新导致文档插入,则设置字段的值。对修改现有文档的更新操作没有影响。
- $unset 从文档中删除指定的字段。
查
db.collection_name.find(query,projection)
,query为可选操作,代表查询条件,不写代表查询所有。projection可选参数,使用投影操作符指定返回的键。查询时返回文档中 所有键值, 只需省略该参数即可(默认省略)。
如果想要显示易读模式,可使用db.collection_name.find(query,projection).pretty()
除了find()以外,还有findOne()方法,只返回一个文档。
MongoDB的查询和sql语句类似,只不它的查询语句以键值对的形式存在,MongoDB与sql中where语句的对比
操作 | 格式 | 范例 | SQL语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.col.find({“name”:“小王”}).pretty() | where name = ‘小王’ |
小于 | {<key>:{$lt:<value>}} | db.col.find({“age”:{$lt:18}}). pretty() | where age < 18 |
小于或 等于 | {<key>:{$lte:<value>}} | db.col.find({“age”:{$lte:18}} ).pretty() | where age <= 18 |
大于 | {<key>:{$gt:}} | db.col.find({“age”:{$gt:18}}) .pretty() | where age > 18 |
大于或 等于 | {<key>:{$gte:<value>}} | db.col.find({“age”:{$gte:18} }).pretty() | where age >= 18 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({“age”:{$ne:18}} ).pretty() | where age != 18 |
MongoDB中OR和AND的用法
AND:find()可传入多个键,每个键以逗号隔开,表示and,db.col.find({key1:value1,key2:value2}).pretty()
,类似sql中的WHERE age = 18 AND name = “小王”。
OR:MongoDB中的or条件语句使用了关键字$or,语法格式如下:
db.col.find({$or:[{key1:value1},{key2:value2}]}).pretty()
,类似sql中的WHERE age = 18 OR name = “小王”。
AND 和 OR联合使用:例如我们要查询所有班级中属于python班的和年龄为18岁的或者属于python班的和年龄为19岁的,mysql中可以这样写:SELECT * FROM classes WHERE class = "python" AND (age = 18 OR age = 19)
,在MongoDB中可以这样写:
db.classes.find({class:"python"},$or:[{age:18},{age:19}]).pretty()
$type操作符:
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
来源:https://www.runoob.com/mongodb/mongodb-operators-type.html
例如,我们要查询classes中所有name为String类型的数据:db.classes.find({name:{$type:2}})
MongoDB limit()
limit()方法可用于获取指定数量的数据记录,接受一个数字参数,表示查看的数据条数,语法如下:
db.COLLECTION_NAME.find().limit(NUMBER)
MongoDB skip()
limit()可以指定查看数据的数量,skip则是跳过指定数量的数据,同样接收一个数字,语法如下:
db.COLLECTION_NAME.find().skip(NUMBER)
例如db.col.find().skip(2)
表示col中所有数据中搁2个取一个。
MongoDB sort()
sort() 方法用于对数据进行排序,可通过参数进行指定排序的字段,使用-1或1指定排序的方式,1为升序,-1为降序,语法如下:
db.COLLECTION_NAME.find().sort({key:1})
例如db.col.find().sort({"age":-1})
表示取出col的所有数据并以age字段进行逆序排序
MongoDB count()
count()方法用于数据的统计,语法如下:
db.col.count() 或 db.col.find().count()
MongoDB aggregate()
MongoDB中聚合(aggregate)主要用于处理数据,例如统计平均值,求和等,并返回计算后的数据结果,语法如下:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
一些常用聚合表达式
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}]) |
python 操作 MongoDB
python中操作MongoDB需要安装第三方模块pymongo:pip install pymongo
# 连接本机mongo
client = pymongo.MongoClient("127.0.0.1",27017)
# 选择test库
db = client.test
# 查询所有数据
db.test.find().pretty()
# 插入数据
db.test.insert({"name":"小王","age":18})