前言:

MongoDB,文档存储型数据库(document store)。NoSQL数据库中,它独占鳌头,碾压其他的NoSQL数据库。

使用C++开发的,性能仅次C。与redis一样,开源、高扩展、高可用。

基于分布式文件存储。分布式:文件分开存的(由Google提出的mapreduce,是目前分布式的鼻祖)。就像苹果的iCloud,照片、文件分开存储的。

纽约时报用的数据库就是它(from wiki),360部分业务的数据库也是它。而且据说伟大的wiki,也是从曾经的MySQL迁移到了MongoDB。

MongoDB的适用场景可以看下这篇文章:https://yq.aliyun.com/articles/64352

但要注意,MongoDB在使用过程中会消耗大量磁盘空间和内存。而且,MongoDB它非事务机制,无法保证事件的原子性。

MongoDB不适合的场景:

(1).需高度事务性的系统。当原子性操作失败时,传统的关系型数据库支持回滚操作,以保证数据在操作过程中的正确性。而目前,MongoDB暂不支持此事务。例如银行或会计系统。

(2).传统的商业智能应用。针对特定问题的BI数据库需要高度优化的查询方式。

(3).使用SQL方便时(关联查询)。MongoDB的查询方式是JSON类型的查询方式,虽然查询也比较灵活,但如果使用SQL进行统计会比较方便时,这种情况就不适合使用MongoDB。

MongoDB描述:

MongoDB是文档数据库,以文档为单位。Bson文档(Json的二进制)

与JS相关,内部引擎用了JS解释器。

把一个文档存储为Bson结构,在查询时,转换位Json对象,并可以通过JS语法来操作。

MongoDB PK 传统型数据库:

传统型数据库:结构化数据,定好表结构后,每一行内容必须符合表结构,以至于每一行看起来都长得差不多。

MongoDB:以文档为单位,没有表结构。表中的每篇文档都可以有自己独特的属性和结构。

MongoDB最大的特点就是反范式化,管你几张表,都可以一个文档解决。每个文档相当于一棵树,可以无限伸枝。文档与文档之间相互独立,没有固定的结构。

(一).文档的表现形式:一个Json对象,一个文档

  1. # 一个文档
  2. {
  3. id: 3
  4. name: "lisi"
  5. age: 10
  6. }
  7.  
  8. # 另一个文档
  9. {
  10. id: 4
  11. name: "wangwu"
  12. age: 20
  13. area: "nb"
  14. hobby: ["swimming", "football"]
  15. }

(二).思考这么一个问题:

以此https://movie.douban.com/subject/26861685/?from=showing为例,设计一个影评数据库。

传统数据库:影片信息一张表,影评一张表,回复评论一张表,打分一张表。查询起来相当费劲,关联相当复杂。

MongoDB:上述内容全部丢进一个文档中解决:

  1. {
  2. file_name: "红海行动"
  3. long_time: 120
  4. comment: [
  5. {
  6. comment1: "影评1"
  7. reply1: "好评"
  8. }
  9. ]
  10. }

一、install MongoDB for win7 32bit(万事从安装开始)

悲催的win7 32位系统,安装这只芒果可是受尽折磨,不是执行命令后没反应、就是因为32/64位的问题……(读音像mango,叶子图标也像芒果叶子,本人就干脆喊芒果了)。

第一步操作成功:(开心)MongoDB的默认端口为27017

第二步配置:(注意环境变量的路径大小写,第一次没成功,后来直接在地址栏上复制了路径,成了!所以猜测,可能是因为路径大小写问题造成)

有时候电脑会抽风,即使配置好了环境变量,在C盘盘符下打这串命令会提示不是内部命令。那么直接cd进入mongodb/bin目录,再执行这条命令,就行了。

可在系统服务中看到它了:

相对现在的新版本,这个算是很老的版本了,不过学习用应该是够了。

MongoDB使用内存映射文件,32位系统上,数据库容量最大上限为2G(学习用而已,有那么多数据吗[糗])关于这个内存映射文件,不了解也没关系,影响不大

第三步:搞一个可视化管理工具

本来想用Robomongo(因为它界面很好看),但没找到适用于win7 32位系统的[/喷血]。如有大大找到的话,恳请提供。

现在在用MongoVUE,专门用于windows系统的。填写连接卡的时候,最后下面三个不填也可以连上。Name随便写,可以写你喜欢的人的名字;Server:具体情况具体填,可以填一个远程主机的IP;Database(s)这项不填,就会获得所有数据库。

二、python3操作MongoDB

(一).连接localhost server,创建一个新数据库

注意:MongoDB的默认端口号是27017,跟其他数据库一样,创建连接时要写上。

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4.  
  5. # 也可以写成
  6. # conn = MongoClient("mongodb://localhost:27017")
  7.  
  8. db = conn.testdb # 创建数据库
  9.  
  10. conn.close()

MongoDB不需要提前创建好数据库,可以直接"连接对象.数据库名称"。如果没有这个数据库,则会自动创建。如果有这个数据库了,就会连接上。

但是,如果该数据库中没有数据,则不会显示在管理工具里面。

(二).增。

(1).插入单条记录

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. # db = MongoClient("localhost", 27017).testdb
  7. # 这样写的话,后面数据库连接就没法关闭了。所以别偷懒,还是要分开写。
  8.  
  9. db.col.insert({"name": "jack613", "province": "江南", "age": 23}) # col是表名
  10.  
  11. conn.close()

(2).插入多条记录

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. db.col.insert([
  7. {"name": '张三', 'province': '江苏', 'age': 24},
  8. {"name": 'mkcry', 'province': '辽宁', 'age': 24},
  9. {"name": 'jack', 'province': '山西', 'age': 30}
  10. ])
  11.  
  12. conn.close()

总结:插入多条记录,insert()的括号中,需要用[]把元素包裹起来。insert([{},{},{}])

(三).删。特别注意:remove()括号中不加条件,就会把表中的记录全删了!切记注意!

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. db.col.remove({"name": "张三"})
  7.  
  8. conn.close()

(四).改。update({条件},{更新的数据})

把条件和更新的数据放进去update()的括号里就可以了。更新语句,注意格式别写错了,应该是{"$set":{"key":value}}

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. db.col.update({"name": "jack"}, {"$set": {"age": 29}})
  7.  
  8. conn.close()

(五).查。

(1).使用find_one()查询并返回第一个匹配到的文档

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. db.col.find_one()
  7.  
  8. conn.close()

可以把"db.col.find_one()"放在print()中,这样就可以看到打印出来的查询结果了。print()之后的结果:{'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'jack', 'province': '江苏', 'age': 88}

这个'_id':ObjectId('xxxxxxxxx')是自动生成的唯一值。

db.col.find_one({"name":"abc"}) 没有找到文档则返回None

(2).查询所有记录。可以使用find()函数,执行后返回的是一个结果集对象,需要用for循环遍历出来。

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. # print(db.col.find()) # <pymongo.cursor.Cursor object at 0x01D96210>
  7.  
  8. for item in db.col.find():
  9. print(item)
  10.  
  11. conn.close()
  12.  
  13. """
  14. # 远行结果:
  15. {'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'jack', 'province': '江苏', 'age': 30}
  16. {'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '张三', 'province': '湖南', 'age': 24}
  17. {'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'mikcry', 'province': '北京', 'age': 24}
  18. {'_id': ObjectId('5a92520f36af001ca0fb665e'), 'name': 'it', 'province': '陕西', 'age': 30}

(3).条件查询

只需要将条件当作参数放进find()的括号中即可:

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. for item in db.col.find({"name": "jack"}):
  7. print(item)
  8.  
  9. conn.close()

例1:查询所有小于某个值的记录

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. for item in db.col.find({"age": {"$lt": 25}}):
  7. print(item)
  8.  
  9. conn.close()
  10.  
  11. """
  12. 运行结果:
  13. {'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '张三', 'province': '湖南', 'age': 24}
  14. {'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'jack', 'province': '山东', 'age': 24}
  15. """

#大于的话,就把{"age":{"$lt":25}}中的lt换成gt

(4).统计记录

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. db.col.find({"age": {"$eq": 88}}).count() # 返回int,但不会直接显示结果,需要赋值变量或者打印
  7. # print(db.col.find({"age": {"$eq": 88}}).count()) # 2
  8.  
  9. conn.close()

(5).根据_id查询记录

需要引入一个库,这个库python3自带了。from bson.objectid import ObjectId

  1. from pymongo import MongoClient
  2. from bson.objectid import ObjectId
  3.  
  4. conn = MongoClient("localhost", 27017)
  5. db = conn.testdb
  6.  
  7. # ObjectId是唯一的,所以用find_one()就可以了
  8. db.col.find_one({'_id': {ObjectId('5a924d0f36af002d307cc30b')}})
  9. # print(db.col.find_one({'_id': ObjectId('5a924d0f36af002d307cc30b')}))
  10. # {'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'jack', 'province': '江苏', 'age': 88}
  11.  
  12. conn.close()

(6).排序。MongoDB默认升序排序。

sort()小括号中放入指定的key就可以了:

  1. from pymongo import MongoClient
  2.  
  3. conn = MongoClient("localhost", 27017)
  4. db = conn.testdb
  5.  
  6. for item in db.col.find().sort("age"):
  7. print(item)
  8.  
  9. conn.close()
  10.  
  11. """
  12. 运行结果:
  13. {'_id': ObjectId('5a92520f36af001ca0fb665c'), 'name': '张三', 'province': '湖南', 'age': 24}
  14. {'_id': ObjectId('5a92520f36af001ca0fb665d'), 'name': 'mikcry', 'province': '山东', 'age': 24}
  15. {'_id': ObjectId('5a924d0f36af002d307cc30b'), 'name': 'jack', 'province': '江苏', 'age': 88}
  16. {'_id': ObjectId('5a92520f36af001ca0fb665e'), 'name': 'it', 'province': '陕西', 'age': 30}
  17. """

另外,可以加入参数去设定排序方式。

比如倒序,例1:(需要引入pymongo)

  1. import pymongo
  2. from pymongo import MongoClient
  3.  
  4. conn = MongoClient("localhost", 27017)
  5. db = conn.testdb
  6.  
  7. for item in db.col.find().sort("age", pymongo.DESCENDING): # descending降序
  8. print(item)
  9.  
  10. conn.close()

(六).补充内容

(1).删除一张表:db.drop_collection("table_name") 表和其中的数据同时删除

(2).查看一个数据库中所有的表:db.collection_names()

NoSQL-MongoDB with python的更多相关文章

  1. 基于mongodb的python之增删改查(CRUD)

    1,下载mongodb的python驱动,http://pypi.python.org/pypi/pymongo/,根据操作系统和python平台版本选择相应的egg或exe安装. 2,新建一个py脚 ...

  2. MongoDB与python交互

    1.Pymongo PyMongo是Mongodb的Python接口开发包,是使用python和Mongodb的推荐方式.官方文档 2.安装 进入虚拟环境 sudo pip install pymon ...

  3. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

  4. NOSQL -- Mongodb的简单操作与使用(win10)

    NOSQL -- Mongodb的简单操作与使用(wins) MongoDB 创建集合: db.createCollection(name, options) use huhu db.createCo ...

  5. NOSQL -- Mongodb的简单操作与使用(wins)

    NOSQL -- Mongodb的简单操作与使用(wins) 启动mongodb: 1.首先启动服务 dos命令下:net start Mongndb 也可以查询服务,手动开启服务: 完成后: 2.启 ...

  6. NOSQL -- mongoDB的了解与安装(Wins10)

    NOSQL -- mongoDB的了解与安装 首先看看什么是nosql: 我的理解:非关系型数据库,大多是以map形式存储,map<key,value>,适合存储,查询.redis也是no ...

  7. MongoDB与python 交互

    一.安装pymongo 注意 :当同时安装了python2和python3,为区分两者的pip,分别取名为pip2和pip3. 推荐:https://www.cnblogs.com/thunderLL ...

  8. MongoDB的Python客户端PyMongo(转)

    原文:https://serholiu.com/python-mongodb 这几天在学习Python Web开发,于是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样的好玩 ...

  9. Python爬取豆瓣音乐存储MongoDB数据库(Python爬虫实战1)

    1.  爬虫设计的技术 1)数据获取,通过http获取网站的数据,如urllib,urllib2,requests等模块: 2)数据提取,将web站点所获取的数据进行处理,获取所需要的数据,常使用的技 ...

  10. NoSQL&MongoDB

    MongoDB: Is NoSQL(技术的实现,并非是一个特定的技术,与RMDS对立):Not only SQL 大数据问题:BigData,eg:同时访问几个页面,代码实现几个页面访问量的大小? F ...

随机推荐

  1. JAVA加解密 -- 数字签名算法

    数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...

  2. ACE_Task::putq(转)

    int ACE_Task< ACE_SYNCH_DECL >::putq (     ACE_Message_Block * , ACE_Time_Value *     timeout ...

  3. GCC与G++那些事儿

    StackOverflow上一个很有名的问题,gcc和g++到底有什么区别? 答案如下: GCC: GNU Compiler Collection 指的是GNU编译器所支持的所有不同的类型的语言 gc ...

  4. 判断一个字符串是否为合法IP

    输入任意一个字符串,判断是否为合法IP bool IsIPAddress(const char * str){ //先判断形式是否合法, //检查是否只包含点和数字 ; str[i] != '\0'; ...

  5. 神奇的canvas——巧用 canvas 为图片添加水印

    代码地址如下:http://www.demodashi.com/demo/11637.html 很久之前写过一篇关于 canvas 的文章,是通过 canvas 来实现一个绚丽的动画效果,不管看过没看 ...

  6. 用尽洪荒之力整理的Mysql数据库32条军规(转)

    今天上午吐血整理了Oracle SQL性能优化的40条军规,其中很多规则也是适用于Mysql的,结果今晚发现这一篇文章——用尽洪荒之力整理的Mysql数据库32条军规,和我的竟有异曲同工之妙,当然不同 ...

  7. oci pool

    http://wenku.baidu.com/link?url=uS8tWxcs7MxNdx5HiGCEyvXsCj0zF5-7pCRVQtlRH5eVuMmSKKqNziSc2O_pyepnnuc_ ...

  8. spring启动加载过程源码分析

    我们知道启动spring容器两常见的两种方式(其实都是加载spring容器的xml配置文件时启动的): 1.在应用程序下加载 ApplicationContext ctx = new ClassPat ...

  9. SVN环境搭建(1)

    原文地址:http://www.penglig.com/post-72.html Subversion 是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建 SVN 服务 ...

  10. 一个关于git push失败的解决方案

    问题背景:在GitHub上创建了一个repositorie, 本地初始化并添加了远程仓库后,在GitHub上创建了一个README.md文件(注意不是从本地git push上去的),随后本地修改工程源 ...