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来写代码。