NoSQL-MongoDB with python

前言:

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对象,一个文档

# 一个文档
{id: 3name: "lisi"age: 10
}# 另一个文档
{id: 4name: "wangwu"age: 20area: "nb"hobby: ["swimming", "football"]
}
View Code

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

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

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

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

{file_name: "红海行动"long_time: 120comment: [{comment1: "影评1"reply1: "好评"}]
}
View Code

 

一、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)这项不填,就会获得所有数据库。

 

二、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 updatesudo apt-get install -y mongodb-orgsystemctl unmask mongodbservice mongodb start
View Code

这些操作后,MongoDB依然不会是最新版本,想要最新版去官网下载并进行源码安装。

 

三、MongoDB原生态命令

(一).插入文档

命令格式:db.collection_name.insert()小括号里写json

例如:

db.biancheng.insert({name:"yekai",age:35,sex:"man",info:{like:"drink",wuqi:"feidao"}})
View Code

(二).更新文档

(1).只更新指定的数据

db.collection_name.update({查询条件json},{$set:{新数据json1,新数据json2,...}})

例如:

db.biancheng.update({name:"yekai"},{$set:{name:"yekai1",age:40}})
View Code

 

四、python3操作MongoDB

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

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

from pymongo import MongoClientconn = MongoClient("localhost", 27017)# 也可以写成
# conn = MongoClient("mongodb://localhost:27017")

db = conn.testdb  # 创建数据库

conn.close()
View Code

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

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

(二).增。

(1).插入单个文档

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdb# db = MongoClient("localhost", 27017).testdb
# 这样写的话,后面数据库连接就没法关闭了。所以别偷懒,还是要分开写。

db.col.insert({"name": "quanquan616", "province": "浙江", "age": 30})  # col是表名

conn.close()
View Code

(2).插入多个文档

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.insert([{"name": '张三', 'province': '浙江', 'age': 24},{"name": 'yuanyuan', 'province': '山东', 'age': 24},{"name": 'jt', 'province': '陕西', 'age': 30}
])conn.close()
View Code

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

(三).删。特别注意:remove()括号中不加条件,就会把表中的记录全删了!切记注意!不然得赔80个亿,跳海喂鲨鱼去吧……

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.remove({"name": "张三"})conn.close()
View Code

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

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

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.update({"name": "quanquan616"}, {"$set": {"age": 29}})conn.close()
View Code

(五).查。

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

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.find_one()conn.close()
View Code

可以把"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 MongoClientconn = 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}
"""
View Code

(3).条件查询

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

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor item in db.col.find({"name": "quanquan616"}):print(item)conn.close()
View Code

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

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor 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}
"""
View Code

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

(4).统计记录

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbdb.col.find({"age": {"$eq": 30}}).count()  # 返回int,但不会直接显示结果,需要赋值变量或者打印
# print(db.col.find({"age": {"$eq": 30}}).count())  # 2

conn.close()
View Code

(5).根据_id查询记录

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

from pymongo import MongoClient
from bson.objectid import ObjectIdconn = 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()
View Code

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

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

from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor 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}
"""
View Code

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

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

import pymongo
from pymongo import MongoClientconn = MongoClient("localhost", 27017)
db = conn.testdbfor item in db.col.find().sort("age", pymongo.DESCENDING):  # descending降序print(item)conn.close()
View Code

(六).补充内容

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

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

 

转载于:https://www.cnblogs.com/quanquan616/p/8463567.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 一个超简单的makefile

2019独角兽企业重金招聘Python工程师标准>>> makefile 自动化变量&#xff1a; $ : 规则的目标文件名 例如&#xff1a;main:main.o test.o g -Wall -g main.o test.o -o main 可以写成&#xff1a; main:main.o test.o g -Wall -g main.o test.o -o $ $< : …

跨域问题

一、为什么会有跨域问题&#xff1f; 是因为浏览器的同源策略是对ajax请求进行阻拦了&#xff0c;但是不是所有的请求都给做跨域&#xff0c;像是一般的href属性&#xff0c;a标签什么的都不拦截。 二、解决跨域问题的两种方式 JSONPCORS 三、JSONP 先简单来说一下JSONP&#x…

PAT A1052

这个需要注意的是相关的string转整数或者double的函数&#xff1b;详见这个链接blog #include <iostream> #include <string> using namespace std; bool isPrime(int n) {if (n 0 || n 1) return false;for (int i 2; i * i < n; i)if (n % i 0) return fa…

php审计学习:xdcms2.0.8注入

注入点Fields: 注册页面会引用如下方法: $fields 变量是从 $fields$_POST[fields]; 这里获取&#xff0c; 在代码里没有过滤。 打印 fields 数据查看: 从代码上看 $field_sql.",{$k}{$f_value}"; 最终会变成: ,truename111111,email12345 因为 $field_sql 最终会引入…

windows下安装python和Python-opencv

背景&#xff1a;目前基于python的图像处理和机器视觉的研究还挺多&#xff0c;最近不是在研究目标检测和目标跟踪的算法&#xff0c;由于检测和跟踪的环境比较简单所以从不带学习的跟踪方法&#xff0c;在搜索资料时搜到这个网站&#xff0c;是对opencv中的目标跟踪算法的一个…

捋一捋js面向对象的继承问题

说到面向对象这个破玩意&#xff0c;曾经一度我都处于很懵逼的状态&#xff0c;那么面向对象究竟是什么呢&#xff1f;其实说白了&#xff0c;所谓面向对象&#xff0c;就是基于类这个概念&#xff0c;来实现封装、继承和多态的一种编程思想罢了。今天我们就来说一下这其中继承…

java8简单入门

1、介绍 本片文章会从一下几个知识点进行介绍&#xff1a; 函数式接口 FunctionalInterfaceLambda 表达式函数引用 Function ReferenceStream看了几篇关于 java8 入门的例子&#xff0c;其中引入了许多令人期待已久的特性&#xff08;虽然我没有过这样的体会&#xff09;&#…

玩转带外触发的单目相机之一

背景&#xff1a;去年开始研究vins,但是只是用了普通的相机&#xff0c;然后将IMU和相机粘在一起&#xff0c;然后就是联合标定相机和IMU。VINS使用的相机是带有外触发的&#xff0c;还进行了相机和IMU的硬件时间同步。当时我特别想买个带外触发的相机&#xff0c;一直没找到资…

基于django的视频点播网站开发-step11-后台用户管理功能...

用户管理功能&#xff0c;包含用户添加、列表展示、编辑、删除四大功能。下面我们一一揭晓。 用户添加 我们先实现用户添加功能&#xff0c;我们现在urls.py下添加相关的路由 path(user_add/, views.UserAddView.as_view(), nameuser_add), path(user_list/, views.UserListVie…

分布式之数据库和缓存双写一致性方案解析

先做一个说明&#xff0c;从理论上来说&#xff0c;给缓存设置过期时间&#xff0c;是保证最终一致性的解决方案。这种方案下&#xff0c;我们可以对存入缓存的数据设置过期时间&#xff0c;所有的写操作以数据库为准&#xff0c;对缓存操作只是尽最大努力即可。也就是说如果数…

‘(‘:illegal token on right side of ‘::‘

背景&#xff1a;想整理升级一下代码&#xff0c;添加了两个类&#xff0c;再一编译代码&#xff0c;出现了好多这样的错误提示“(:illegal token on right side of ::”&#xff0c;我很纳闷这是啥问题&#xff0c;我就使用“注释法”来定位出错的位置&#xff0c;我发现把所有…

虹软免费人脸识别SDK注册指南

2019独角兽企业重金招聘Python工程师标准>>> 成为开发者三步完成账号的基本注册与认证&#xff1a; STEP1:点击注册虹软AI开放平台右上角注册选项&#xff0c;完成注册流程。 STEP2:首次使用&#xff0c;登录后进入开发者中心&#xff0c;点击账号管理完成企业或者个…

C++中的类加多线程代码修炼

背景&#xff1a;现在在做一个目标跟踪的项目&#xff0c;需要实时的从工业相机中获取图像&#xff0c;然后再跟踪图像上的目标物&#xff0c;由于起初为了测试跟踪算法&#xff0c;就把“从相机获取图像”和“跟踪处理”都放在了主线程中&#xff0c;在实际测试时&#xff0c;…

vue的鼠标移入和移出

vue的鼠标移入和移出 需求&#xff08;鼠标到预约二维码显示&#xff0c;预约添加背景色&#xff09; 实现 <!--html部分--> <ul class"person_list"> //五个li标签皆是循环渲染出来的<li class"item" v-for"(n,index) in 5">…

聊聊flink的MemoryPool

为什么80%的码农都做不了架构师&#xff1f;>>> 序 本文主要研究一下flink的MemoryPool MemoryPool flink-runtime_2.11-1.7.2-sources.jar!/org/apache/flink/runtime/memory/MemoryManager.java abstract static class MemoryPool {abstract int getNumberOfAvai…

表达式求值

表达式求值问题 ①问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式&#xff0c;如&#xff1a;1122*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则&#xff0c;相同级别从左到右进行计算。表达式还有后缀式&#xff08;如&#xff1a;22 7 4 - * 3 / 1…

C++中的类加多线程代码修炼之二

背景&#xff1a;在上一篇文章中 写到了我第一次使用C使用多个类多个线程进行编程&#xff0c;由于是第一接手“这么大一个工程”&#xff0c;所以还是要有个参照物的&#xff0c;由于我呢之前好几年一直在看的一个C代码工程就是ORB-SLAM了&#xff0c;这个工程使用C语言&#…

3-4 第三天 Generator生成器

Generator是ES6里面的新增规范&#xff0c;ES6其实就是ES2015。ES5、ES6、ES7这些术语大家上网一查就都明白了。JavaScript是一个范程&#xff0c;就是我们说的JS。ES就是ECMA Script&#xff0c;是JavaScript标准的书面说法。ES4、5、6、7其实是JS这门语言发展中的不同的版本。…

神奇的事情--长见识了

背景&#xff1a;我的这个工程里有多个命名空间&#xff0c;之所以是这样是因为&#xff0c;有一个跟踪算法他本身有几个namespace,然后我在他的基础上进行整合代码&#xff0c;将其作为一个功能接口&#xff0c;供其他函数调用&#xff0c;我在整合代码时&#xff0c;将我新加…

箭头函数的使用用法(一)

1 //箭头函数的一个好处是简化回调函数2 //箭头函数没有参数&#xff0c;就使用圆刮号代表参数部分&#xff1b;3 var f () >5;4 console.log(f());5 //两个参数的情况&#xff0c;代码块只有一条语句&#xff0c;可以省略{}6 var f (a,b)> console.log(ab);7 f(1,3);8…