MongoDB:是一个基于分布式文件存储的非关系数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB的查询语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
NoSQL:指非关系型数据库,有的文档称作Not Only SQL的缩写,是对不同于传统的关系型数据库管理系统的统称。适用于超大规模数据的存储。
NoSQL特点:
1.没有声明性查询语言
2.没有预定义的模式
3.key-value形式的键值对存储、列存储、文档存储、图形数据库
4.最终一致性,非ACID属性
5.CAP定理
6.高性能、高可用性、可伸缩性
CAP定理:一个分布式系统不可能同时很好的满足 一致性、可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
一致性(Consistency):所有节点在同一时间具有相同的数据
可用性(Availability):保证每个请求不管成功或者失败都有响应
分区容错性(Partition tolerance):系统中任意信息的丢失或失败不会影响系统的继续运行
只能同时满足上面三点中的两点,也就是说有CA、CP和AP三种类型的搭配。
分布式系统:(distributed system)是建立在网络之上的软件系统。所以分布式系统具有高度的内聚性和透明性。
BASE:BASE是对CAP原理中一致性( C )和可用性(A)权衡的结果。即:即使无法做到强一致性,但是可以根据业务特点,采用适当的方式使系统达到最终一致性。
BASE是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写
MongoDB下载:下载链接为:https://www.mongodb.com/download-center/community ,若该链接不可用,可去https://www.mongodb.com/ 寻找最新的下载地址。如下图所示:下载地址有不同平台和版本可供选择,选择自己所需版本下载即可。这里我下载的是适用于Mac平台的4.0.12版本。对于Mac平台:从 MongoDB 3.0 版本开始只支持 OS X 10.7 (Lion) 版本及更新的mac版本系统(下载时要注意自己的mac系统版本和MongoDB版本的兼容性)。
为了方便我用curl命令下载:
1.进入/usr/local/
cd /usr/local/
2.用curl命令下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.12.tgz
3.解压下载下来的MongoDB包
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.12.tgz
4.将解压出来的目录重命名为 mongodb
sudo mv mongodb-osx-x86_64-4.0.12 mongodb
MongoDB配置
1.进入 /usr/local/mongodb/ 目录
cd /usr/local/mongodb/
2.创建一个数据库存储目录
sudo mkdir data/db
3.创建一个log作为日志文件目录
sudo mkdir -p log
4.创建一个log/mongo.log日志文件
sudo touch log/mongo.log
5.创建一个 etc 目录作为MongoDB配置文件的目录
sudo mkdir etc
6.创建配置文件etc/mongo.conf
sudo touch etc/mongo.conf
7.修改 etc/mongo.conf权限
sudo chmod 777 etc/mongo.conf
8.将下列项写入配置文件 etc/mongo.conf
logpath=/usr/local/mongodb/mongo.log
logappend=true
dbpath=/usr/local/mongodb/data/db
fork=true
port=27017
上面的 fork=true 只在linux平台下有效,意思是以守护进程的方式在后台运行。
运行MongoDB
1.进入 /usr/local/mongodb/bin/ 目录
cd /usr/local/mongodb/bin/
2.运行MongoDB
sudo ./mongod --config /usr/local/mongodb/etc/mongo.conf
3.进入MongoDB
./mongo
使用MongoDB
查看所有数据库,使用 show dbs
show dbs
切换/创建数据库: use DATABASE_NAME
use food
创建集合
db.createCollection("students")
删除数据库用 db.dropDatabase()
db.dropDatabase()
MongoDB其他常用命令见另一篇博客MongoDB常用命令
关闭MongoDB服务
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> use admin
switched to db admin
> db.shutdownServer()
2019-09-09T00:32:05.661+0800 I NETWORK [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
2019-09-09T00:32:05.663+0800 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed
2019-09-09T00:32:05.664+0800 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed
> exit
bye
Python操作MongoDB
Python要连接MongoDB,需要MongoDB驱动,使用pymongo驱动来连接。我自己环境Python版本为3.7.
安装pymongo:
pip3 install pymongo
然后创建一个python脚本文件:mongo_test.py
#!/usr/bin/python3
import pymongo
def test_mongo():
# 获取数据库连接
test_client = pymongo.MongoClient("127.0.0.1", 27017)
# 获取MongoDB中所有的数据库
db_list = test_client.list_database_names()
# 获取数据库(如果没有则会创建一个数据库)
test_db = test_client["hduedu"]
# 获取所有的集合
col_list = test_db.list_collection_names()
# 获取集合(如果没有则会新建一个集合)
test_col = test_db["teacher"]
# 向集合中插入数据
# 插入一个文档用:insert_one(document),这里document是一个字典
# 插入多个文档用:insert_many(document),这里document是一个字典列表
document01 = {"name": "tony", "age": 36}
test_col.insert_one(document01)
# 查询集合中的数据
# 查询一条数据用:find_one()
one_data = test_col.find_one()
# 查询集合中所有数据用:find()
all_data = test_col.find()
# 有条件的查询用:find("查询条件")
# 查询指定字段的数据:1表示返回,0表示不返回
cond_data = test_col.find({}, {"_id":0, "name":1})
# 查询name=tom的数据
tom_data = test_col.find({"name": "tom"})
# 查询年龄小于35岁的数据
data35 = test_col.find({"age": {"$lt": 35}})
# 查询name字段中以m结尾的数据
data_m = test_col.find({"name": {"$regex": "m$"}})
# 只查询3条数据记录
data_3 = test_col.find().limit(3)
# 修改数据
# 修改一条数据用:update_one()
my_query = {"name": "tony"}
new_value = {"$set": {"age": 44}}
test_col.update_one(my_query, new_value)
# 修改多条数据用:update_many()
test_col.update_one(my_query, new_value)
# 查询结果排序用:sort(字段,规则) 1升序,-1降序
test_col.find().sort("age", 1)
test_col.find().sort("age", -1)
# 删除数据
# 删除一条数据用: delete_one()
test_col.delete_one({"name": "tony"})
# 删除多条数据用:delete_many()
test_col.delete_many({"name": {"$regex": "ny$"}})
# 删除集合中所有数据
test_col.delete_many({})
# 删除集合
test_col.drop()
if __name__ == '__main__':
test_mongo()
mongoengine:是一个对象文档映射器(ODM-Object Document Mapping)。mongoengine是基于pymongo的。mongoengine用起来就相当于一个基于SQL的对象关系映射器(ORM-Object Relational Mapping)。
安装mongoengine
pip3 install mongoengine
创建一个Python脚本:mongoengine_test.py
#!/usr/bin/python3
import mongoengine
# 连接数据库
mongoengine.connect("hduedu", host="127.0.0.1", port=27017)
class Teacher(mongoengine.Document):
name = mongoengine.StringField(required=True)
age = mongoengine.IntField(required=True)
if __name__ == '__main__':
# 往集合中增加数据
teacher01 = Teacher()
teacher01.name = "andy"
teacher01.age = "12"
teacher01.save()
# 删除name=tony的数据
teacher02 = Teacher.objects(name="tony")
teacher02.delete()
# 将集合中age=12的数据的name修改为jane
# 修改的方法有:update_one() update()
teacher03 = Teacher.objects(age=12).update_one(set__name="jane")
# 获取集合中所有数据
# 查询方法有:all() first() filter()
all_teachers = Teacher.objects.all()
for teacher in all_teachers:
print("name:{0}, age:{1}".format(teacher.name, teacher.age))
简单用法如上,为了方便维护代码,使用mongoengine时可使用MVC来写代码。