前言:html
MongoDB,文档存储型数据库(document store)。NoSQL数据库中,它独占鳌头,碾压其余的NoSQL数据库。python
使用C++开发的,性能仅次C。与redis同样,开源、高扩展、高可用。linux
基于分布式文件存储。分布式:文件分开存的(由Google提出的mapreduce,是目前分布式的鼻祖)。就像苹果的iCloud,照片、文件分开存储的。redis
纽约时报用的数据库就是它(from wiki),360部分业务的数据库也是它。并且听说伟大的wiki,也是从曾经的MySQL迁移到了MongoDB。mongodb
MongoDB的适用场景能够看下这篇文章:https://yq.aliyun.com/articles/64352数据库
但要注意,MongoDB在使用过程当中会消耗大量磁盘空间和内存。并且,MongoDB它非事务机制,没法保证事件的原子性。json
MongoDB不适合的场景:ubuntu
(1).需高度事务性的系统。当原子性操做失败时,传统的关系型数据库支持回滚操做,以保证数据在操做过程当中的正确性。而目前,MongoDB暂不支持此事务。例如银行或会计系统。windows
(2).传统的商业智能应用。针对特定问题的BI数据库须要高度优化的查询方式。分布式
(3).使用SQL方便时(关联查询)。MongoDB的查询方式是JSON类型的查询方式,虽然查询也比较灵活,但若是使用SQL进行统计会比较方便时,这种状况就不适合使用MongoDB。
MongoDB描述、层次结构:
(一).描述
MongoDB是文档数据库,以文档为单位。Bson文档(Json的二进制)
与JS相关,内部引擎用了JS解释器。
把一个文档存储为Bson结构,在查询时,转换位Json对象,并能够经过JS语法来操做。
(二).层次结构
库 -> 集合 -> 文档
MongoDB PK 传统型数据库:
传统型数据库:结构化数据,定好表结构后,每一行内容必须符合表结构,以致于每一行看起来都长得差很少。
MongoDB:以文档为单位,没有表结构。表中的每篇文档均可以有本身独特的属性和结构。
MongoDB最大的特色就是反范式化,管你几张表,均可以一个文档解决。每一个文档至关于一棵树,能够无限伸枝。文档与文档之间相互独立,没有固定的结构。
(一).文档的表现形式:一个Json对象,一个文档
# 一个文档 { id: 3 name: "lisi" age: 10 } # 另外一个文档 { id: 4 name: "wangwu" age: 20 area: "nb" hobby: ["swimming", "football"] }
(二).思考这么一个问题:
以此https://movie.douban.com/subject/26861685/?from=showing为例,设计一个影评数据库。
传统数据库:影片信息一张表,影评一张表,回复评论一张表,打分一张表。查询起来至关费劲,关联至关复杂。
MongoDB:上述内容所有丢进一个文档中解决:
{ file_name: "红海行动" long_time: 120 comment: [ { comment1: "影评1" reply1: "好评" } ] }
1、install MongoDB for win7 32bit(万事从安装开始)
悲催的win7 32位系统,安装MongoDB但是受尽折磨,不是执行命令后没反应、就是由于32/64位的问题……
好在运气不错,找到了这篇文章:https://www.cnblogs.com/chenyucong/p/6217017.html,此博主提供了一个版本,本人跟着操做也行了。
直接照着那篇搞就能够:
第一步操做成功:MongoDB的默认端口为27017
第二步配置:(注意环境变量的路径大小写,第一次没成功,后来直接在地址栏上复制了路径,成了!因此猜想,多是由于路径大小写问题形成)
有时候电脑会抽风,即便配置好了环境变量,在C盘盘符下打这串命令会提示不是内部命令。那么直接cd进入mongodb/bin目录,再执行这条命令,就好了。
可在系统服务中看到它了:
相对如今的新版本,这个算是很老的版本了,不过学习用应该是够了。
MongoDB使用内存映射文件,32位系统上,数据库容量最大上限为2G,关于这个内存映射文件,不了解也不要紧,影响不大。找来了伟大的wiki:https://zh.wikipedia.org/wiki/%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6
第三步:搞一个可视化管理工具
原本想用Robomongo(由于它界面很好看),但没找到适用于win7 32位系统的[/喷血]。若有大大找到的话,恳请提供。
如今在用MongoVUE,专门用于windows系统的。填写链接卡的时候,最后下面三个不填也能够连上。Name随便写,能够写你喜欢的人的名字;Server:具体状况具体填,能够填一个远程主机的IP;Database(s)这项不填,就会得到全部数据库。
2、install MongoDB on Ubuntu server
(一).简易安装
ubuntu server的apt秒天秒地,更新好apt以后直接键入命令:apt install mongodb
安装完后,想要查看版本可用命令:mongo -version
用apt命令直接安装不会是最新版本,最好去官网https://www.mongodb.com/download-center/community下载进行源码安装。
(二).在ubuntu server中的更新MongoDB
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list sudo apt-get update sudo apt-get install -y mongodb-org systemctl unmask mongodb service mongodb start
这些操做后,MongoDB依然不会是最新版本,想要最新版去官网下载并进行源码安装。
(三).官方安装
官方网站的安装教程:https://docs.mongodb.com/manual/administration/install-community/
(1).安装时遇到问题记录,mark1
个人安装方式是参考了官方教程上的更新apt索引方式进行安装,安装时因为没有灵活上网,致使下载速度极慢,因而强行终止了安装进程,想要等会儿再试。结果当再次敲apt安装命令时,就报了一大堆的错误。
后来Google一大通以后,终于解决了问题可以用上了,因而记录下来了。
依次执行下面的linux代码(我当时使用的是Ubuntu server 18.04 LTS 64bit):
sudo apt-get purge mongodb-org sudo apt-get purge mongodb mongodb-server mongodb-server-core mongodb-clients sudo apt-get autoremove sudo apt-get update sudo apt-get install mongodb-org sudo dpkg --remove --force-remove-reinstreq mongo-tools sudo dpkg --remove --force-remove-reinstreq mongodb-server-core sudo apt-get --fix-broken install sudo systemctl enable mongod sudo service mongod restart
若是上面的命令仍是不能让mongo服务跑起来,试一下下面的代码(其实就是在上面的代码中加了几行文件夹设置命令):
sudo apt-get purge mongodb-org sudo apt-get purge mongodb mongodb-server mongodb-server-core mongodb-clients sudo apt-get autoremove sudo apt-get update sudo apt-get install mongodb-org sudo dpkg --remove --force-remove-reinstreq mongo-tools sudo dpkg --remove --force-remove-reinstreq mongodb-server-core sudo apt-get --fix-broken install mv /var/lib/mongodb /var/lib/mongodb_backup mkdir /var/lib/mongodb chmod 700 /var/lib/mongodb chown mongodb:daemon /var/lib/mongodb sudo systemctl enable mongod sudo service mongod restart
3、MongoDB原生态命令
(一).插入文档
命令格式:db.collection_name.insert()小括号里写json
例如:
db.biancheng.insert({name:"yekai",age:35,sex:"man",info:{like:"drink",wuqi:"feidao"}})
(二).更新文档
(1).只更新指定的数据
db.collection_name.update({查询条件json},{$set:{新数据json1,新数据json2,...}})
例如:
db.biancheng.update({name:"yekai"},{$set:{name:"yekai1",age:40}})
4、python3操做MongoDB
(一).链接localhost server,建立一个新数据库
注意:MongoDB的默认端口号是27017,跟其余数据库同样,建立链接时要写上。
from pymongo import MongoClient conn = MongoClient("localhost", 27017) # 也能够写成 # conn = MongoClient("mongodb://localhost:27017") db = conn.testdb # 建立数据库 conn.close()
MongoDB不须要提早建立好数据库,能够直接"链接对象.数据库名称"。若是没有这个数据库,则会自动建立。若是有这个数据库了,就会链接上。
可是,若是该数据库中没有数据,则不会显示在管理工具里面。
(二).增。
(1).插入单个文档
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb # db = MongoClient("localhost", 27017).testdb # 这样写的话,后面数据库链接就无法关闭了。因此别偷懒,仍是要分开写。 db.col.insert({"name": "quanquan616", "province": "浙江", "age": 30}) # col是表名 conn.close()
(2).插入多个文档
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb db.col.insert([ {"name": '张三', 'province': '浙江', 'age': 24}, {"name": 'yuanyuan', 'province': '山东', 'age': 24}, {"name": 'jt', 'province': '陕西', 'age': 30} ]) conn.close()
总结:插入多个文档,insert()的括号中,须要用[]把元素包裹起来。insert([{},{},{}])
(三).删。特别注意:remove()括号中不加条件,就会把表中的记录全删了!切记注意!否则得赔80个亿,跳海喂鲨鱼去吧……
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb db.col.remove({"name": "张三"}) conn.close()
(四).改。update({条件},{更新的数据})
把条件和更新的数据放进去update()的括号里就能够了。更新语句,注意格式别写错了,应该是{"$set":{"key":value}}
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb db.col.update({"name": "quanquan616"}, {"$set": {"age": 29}}) conn.close()
(五).查。
(1).使用find_one()查询并返回第一个匹配到的文档
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb db.col.find_one() conn.close()
能够把"db.col.find_one()"放在print()中,这样就能够看到打印出来的查询结果了。print()以后的结果:{'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30}
这个'_id':ObjectId('xxxxxxxxx')是自动生成的惟一值。
db.col.find_one({"name":"abc"}) 没有找到文档则返回None
(2).查询全部记录。可使用find()函数,执行后返回的是一个结果集对象,须要用for循环遍历出来。
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb # print(db.col.find()) # <pymongo.cursor.Cursor object at 0x01D96210> for item in db.col.find(): print(item) conn.close() """ # 远行结果: {'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30} {'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '张三', 'province': '浙江', 'age': 24} {'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'yuanyuan', 'province': '山东', 'age': 24} {'_id': ObjectId('5a92520f36af001ca0fb665e'), 'name': 'jt', 'province': '陕西', 'age': 30} """
(3).条件查询
只须要将条件看成参数放进find()的括号中便可:
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb for item in db.col.find({"name": "quanquan616"}): print(item) conn.close()
例1:查询全部小于某个值的记录
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb for item in db.col.find({"age": {"$lt": 25}}): print(item) conn.close() """ 运行结果: {'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '张三', 'province': '浙江', 'age': 24} {'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'yuanyuan', 'province': '山东', 'age': 24} """
补充:大于的话,就把{"age":{"$lt":25}}中的lt换成gt
(4).统计记录
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb db.col.find({"age": {"$eq": 30}}).count() # 返回int,但不会直接显示结果,须要赋值变量或者打印 # print(db.col.find({"age": {"$eq": 30}}).count()) # 2 conn.close()
(5).根据_id查询记录
须要引入一个库,这个库python3自带了。from bson.objectid import ObjectId
from pymongo import MongoClient from bson.objectid import ObjectId conn = MongoClient("localhost", 27017) db = conn.testdb # ObjectId是惟一的,因此用find_one()就能够了 db.col.find_one({'_id': {ObjectId('5a924d0f36af002d307cc30b')}}) # print(db.col.find_one({'_id': ObjectId('5a924d0f36af002d307cc30b')})) # {'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30} conn.close()
(6).排序。MongoDB默认升序排序。
sort()小括号中放入指定的key就能够了:
from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb for item in db.col.find().sort("age"): print(item) conn.close() """ 运行结果: {'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '张三', 'province': '浙江', 'age': 24} {'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'yuanyuan', 'province': '山东', 'age': 24} {'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'quanquan616', 'province': '浙江', 'age': 30} {'_id': ObjectId('5a92520f36af001ca0fb665e'), 'name': 'jt', 'province': '陕西', 'age': 30} """
另外,能够加入参数去设定排序方式。
好比倒序,例1:(须要引入pymongo)
import pymongo from pymongo import MongoClient conn = MongoClient("localhost", 27017) db = conn.testdb for item in db.col.find().sort("age", pymongo.DESCENDING): # descending降序 print(item) conn.close()
(六).补充内容
(1).删除一张表:db.drop_collection("table_name") 表和其中的数据同时删除
(2).查看一个数据库中全部的表:db.collection_names()