python学习笔记——mongodb数据库

1 概述

1.1 文件管理阶段

优势:能够长期保存 能存储大量数据java

缺点:没有结构化的组织 查找不方便 数据容易冗余python

1.2 数据库管理阶段

有文件存储的优势,同时解决了文件存储的问题mysql

缺点 : 操做难度较高linux

数据 --> 数据库 --> 数据库管理系统 --> 数据库系统c++

2 数据库分类

2.1 关系型数据库

采用关系磨性来组织数据结构的数据库正则表达式

常见数据库形式有:Oracle DB2  SQLServer  Mysql  sqliteredis

优势:sql

(1)容易理解,使用方便,sql语句自己比较成熟,而关系型数据库大都采用sql作数据操做mongodb

(2)易于维护,完整性好,数据一致性高shell

(3)通用化程度高,技术成熟,可使用外链等操做

缺点:

(1)没法很好知足高并发需求,每次数据操做都须要解析sql语句,致使读写能力降低(通常该类型数据库都是用C / C++语言编写的,输入时采用sql语句,须要编译)

(3)针对海量数据的爆发处理能力不足,每次操做都要上锁

(4)扩展性不足

 

2.2 非关系型数据库 (Nosql not only sql)

优势:

(1)能够知足高并发需求,读写能力强

(2)支持分布式部署

(3)弱化了数据结构,下降了数据的一致性

缺点:

(1)发展比较晚,技术尚不成熟,好比缺乏join等复杂性操做,通用性差,没有sql这样的语句

(2)结构灵活,灵活则会致使混乱,写法复杂

 

非关系性数据库(Nosql)适用那些状况

(1)数据磨性结构简单

(2)对数据的一致性要求低

(3)对数据的并发处理要求高

(4)对数据的扩展性有要求

 

非关系型数据库Nosql分类

(1)键值类数据库:

    redis  oracle  DBD  tokyo

    如:name:张三

(2)列存储:

    HBase

(3)文档型数据库:

    MongDB

    { name:张三, sex:男}

(4)图形数据库

3 MongoDB数据库

3.1 数据库特色

(1)非关系型 文档型

(2)C++ 编写,支持分布式

(3)数据格式为bson类型,bson格式是jion的升级版,他丰富了json的数据类型

(4)功能比较前面

(5)支持众多编程语言接口 python ruby C#  C++ PHP

3.2 MongoDB的安装

自动安装

在Linux系统中的安装步骤

(1)sudo apt -get update

(2)sudo apt -get install mongodb

 

默认安装目录:/var/lib/mongodb

配置文件:

    /etc/mongodb.conf

   /usr/bin

 

手动安装

(1)www.mongodb.com 下载安装包

(2)在目录下解压  /usr/local/opt

(3)解压后将文件夹中bin目录添加到环境变量中

        export PATH = $PATH:/usr...

3.3 mongo的基本操做

在linux终端上输入mongo能够启动mongo shell

 

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test

 

该模式下支持简单的语法

quit() 退出 mongo shell

mongod

--dbpath:指定数据目录,每一个mongod进程都须要独立的数据目录,若是要是有3哥mongod实例,则必须有3个独立的数据目录;当mongod启动时,会在数据库目录中建立mongod.lock文件,这个文件用于防止其余的mongod纯净使用该数据目录

 

--port:指定服务器监听的端口号,默认端口号为27017,要运行多个mongo进程,则要给每一个指定不一样的端口号。

--logpath:指定日志的输出路径,若是对文件夹有读写权限,系统会在文件不存在时建立它,它会将已有文件覆盖掉;

--logappend:同logpath,但该选项可不会将原有文件覆盖,而是保留原来的日志

--config:指定配置文件,加载命令行未指定的各类选项

3.4 mongo的基本概念

为了对比,现将关系型数据库mysql与mongo进行对比

(1)MySQL与mongo基本含义对比

MySQL           mongo          含义

database         database       数据库

table              collection       表/集合

column          field             字段/域

row               document     记录/文档(每一条信息称之为文档)

index            index            索引

(2)数据形式对比

MySQL数据(表)结构形式

---------------------------
id |   name    | age
---------------------------
1 |    Lily       | 10
---------------------------
2 |    Lucy     | 11
---------------------------

mongo数据结构(字典)

 

{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lily',
'age': 10
},
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lucy',
'age': 11
}

 

3.5 建立数据库

建立数据库:use dbname(dbname为数据库名)

注:

(1)use为选择使用的数据库,若是数据库不存在,则插入数据时会自动建立该数据库

实例:

 

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> use dbname
switched to db dbname
>
# use 并非直接将数据库建立起来,主要仍是选择这个数据,只有真正建立这个表时,才是真正建立这个数据库
> show dbs
admin (empty)
local 0.078GB
mongo_test 0.078GB
>
# 此时并无显示dbname数据库,因里面并无数据

(2)db(全局变量)表示当前正在使用的数据库,若是没有use选用目标数据库,则默认使用一个叫test的数据库

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> db
test
> use dbname
switched to db dbname
> db
dbname

 

数据库的命名规则和特色

(1)数据库支持格式为utf-8

(2)数据库区分大小写,原则上都是小写;sql语句则不区分大小写

(3)命名也能够是utf-8格式,但不能是空字符串

(4)数据库名不能含有:空格、点、/ \ '\0'

(5)不能超过64字节

(6)数据库避免与诸如admin、local、config等数据库关键字冲突

 

注:admin(存储用户权限)、local(存储不想被分享复制的数据)、config(当分布式操做时才会出现,表示分片处理信息)

3.6 数据的备份与恢复

备份:

mongodump   -h   dbhost     -d   dbname   -o    dbdir
                               主机              数据库           文件夹

tarena@tedu:~$ mongodump -h 127.0.0.1 -d stu -o dbstudent
connected to: 127.0.0.1
2018-05-08T22:28:06.022+0800 DATABASE: stu     to     dbstudent/stu
...

查找是否已经备份成功

tarena@tedu:~$ ls
AID1709.csv  dbstudent                   PycharmProjects  视频  下载
anaconda3    examples.desktop            公共的           图片  音乐
core         java_error_in_PYCHARM_.log  模板             文档  桌面

tarena@tedu:~$ ls dbstudent/
stu

 

恢复数据

mongorestore  -h  dbhost    -d      dbname                                 <path>
                              主机               将数据回复到那个数据库        要恢复数据库文件夹

tarena@tedu:~$ mongorestore -h 127.0.0.1:27017 -d student student/stu
connected to: 127.0.0.1:27017
...

3.7 数据库删除

db.dropDatebase()

功能:删除当前数据库

3.8 数据库检测

tarena@tedu:~$ mongostat
connected to: 127.0.0.1
insert  query update delete getmore command flushes mapped  vsize    res faults  locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 
    *0     *0     *0     *0       0     1|0       0   640m  1.47g    35m      1  test:0.0%          0       0|0     0|0    62b     4k     1   22:40:13 
    *0     *0     *0     *0       0     1|0       0   640m  1.47g    35m      0  test:0.0%          0       0|0     0|0    62b     4k     1   22:40:14 

具体截图

备注:insert (每秒的插入次数) query(每秒的查询次数) update(更新次数) delete(删除次数 )

3.9 检测数据库的读写时长

mongotop  监测数据库的读写时长 

tarena@tedu:~$ mongotop
connected to: 127.0.0.1

                            ns       total        read       write        2018-05-08T14:48:20
        grid.system.namespaces         0ms         0ms         0ms
           grid.system.indexes         0ms         0ms         0ms
                 grid.fs.files         0ms         0ms         0ms
                grid.fs.chunks         0ms         0ms         0ms
       grade.system.namespaces         0ms         0ms         0ms
          grade.system.indexes         0ms         0ms         0ms
                   grade.class         0ms         0ms         0ms

截图显示

3.10 查看数据库

 查看方式:show dbs

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> show dbs
admin       (empty)
dbname      0.078GB
local       0.078GB
mongo_test  0.078GB
> use stu
switched to db stu
> db.createCollection('class0')
{ "ok" : 1 }
> db.createCollection('class0')
{ "ok" : 0, "errmsg" : "collection already exists" }

 

4 集合

 db.createCollection(collection_name) 

功能:建立一个集合

参数:集合的名称

注:至关于 sql 语句中的表

4.1 集合的命名规则

(1)集合名不能以system 开头,它是系统集合保留的前缀

(2)集合名称不要和关键字重名,不要带有$

(3)集合名能含有 ‘\0'

(4)集合也是utf-8字符串

 

4.2 集合的建立

 db.collection_name.insert() 

collection_name:集合名

当插入数据时,若是集合不存在则会自动建立;此也意味着,若将集合名称写错时也会建立新的集合并插入数据

4.3 查看数据库中的集合

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> show collections
class3
system.indexes
> show tables
class3
system.indexes
> 

show collections 和 show tables 能够达到相同效果

4.4 集合的建立(一)

db.createCollection(collection_name)

功能:建立一个集合

参数:集合的名称

命名规则:

(1)集合也是utf-8 字符串

(2)不能含有'\0',由于最终是用c++来解析的,当存在'\0'时,c++就会默认为这是结束的

(3)不能以system.开头,他是系统集合的保留前缀

(4)集合名称不要和关键字重名 ,不要带有$,mongdb中好多关键字是有$引入的,也即,集合名称不要额操做符重名

4.5 集合的建立(二)

db.collection_name.insert()

当插入数据时,集合不存在时则会自动建立

若是将集合名称写错时,也会建立新的集合并插入数据

4.6 删除一个集合

删除指定的集合:db.collecton_name.drop() 

> show collections
abc
class0
class1
system.indexes
> db.abc.drop()
true
> show collections
class0
class1
system.indexes

4.7 集合的重命名

db.collection_name.renameCollection(new_name)

参数:新的集合名称

> show collections
class0
class1
system.indexes
> db.class1.renameCollection('cls')
{ "ok" : 1 }
> show collections
class0
cls
system.indexes
>

5 文档

在形式上相似于python中的字典,每一个文档内部由 0个 或 多个 键值对构成,但文档不一样于字典的是,文档是有序的。

bson:{'name':'licy','age':18}

 

键的命名规则:

(1)键值均为uft-8类型字符串,因此做为键时,加不加都可

> db.class0.insert({'name':'李四'  ,age:19,})
WriteResult({ "nInserted" : 1 })
> db.class0.find()
{ "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 }
>

(2)不能有‘\0',通常不会以点.和 $ 开头,也不使用下划线_开头

(3)键不能重复

 

文档中的值:

指的是mongo数据库支持的数据类型

mongo支持的数据类型:

字符串            utf-8字符串均为合法字符串

整型               32位 和64位

布尔类型        true false 或者1 0来表示也能够

浮点型           小数

Arrays            用来存储数组胡列表

Timestamp     时间戳,存储时间节点

Date              时间类型,年月日时分秒

Symbol          字符串类型 一般用来存储特殊字符

Null                null类型 表示空

object            文档类型(一般用于内部文件)

Binary data    二进制数据

code              代码 js

regex             正则表达式

ObjectId        系统自动生成的ID对象

 

在一个集合中文档的域不必定相同,也就是说键值对不必定彻底相同

在一个文档中尽可能选择意义相同的文档放入统一集合中

5.1 insert() 方法

db.collection.insert()

例如

> db.class0.insert({'name':'李四'  ,age:19,})
WriteResult({ "nInserted" : 1 })
> db.class0.find()
{ "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 }
>
ObjectId("5abf2fe426803c9f334a1019")

_id:是系统自动提供的主键,

5abf2fe4             26803c    9f33        4a1019     24位16进制

文档建立时间      机器ID     进程ID     计数器

 

插入多条文档

insert([{},{},{}])

db.class0.insert([{'name':'王五',age:18,sex:'女'},{name:'张三',age:19,sex:'女'}])

insert() 插入数据时,也能够采用_id 来自定义插入id值,但id值不能重复。

5.2 save() 方法

db.collection.save()

实例

db.class0.save({_id:2,name:'娄拉',age:22,sex:''})

注:

(1)当插入键值对中没有_id 域时,同insert

(2)当插入键值对有_id值,则会将拟插入的_id值与已插入的_id值进行匹配,若是匹配到已经插入的值,则会对相应文档进行修改,若是没有匹配到则其功能至关于insert(),将会插入到数据库中

(3)save() 没法插入多条数据

5.3 find() 查找

db.collection.find(query, field)

功能:查找文档

参数:

    query 查找条件 {name:'张三'}

    field 显示的域  {_id:0}

返回值:返回查找到的文档(返回第一条,先进先出,查找的第一条,也即先输入的第一条)

 

field的值的表示方式:{field:0|1}

    0:表示不显示该域

    1:表示显示该域

注:

(1)若将某个域设置为1,则表示其余域均为0

(2)若将某个域设置为0,则表示其余域均为1

(3)不容许同时设置1和 0

(4)_id 永远默认为1,也可将其设置为0

5.4 findOne()查找

db.collection.findOne(query, field)

功能:只查找第一条符合查找条件的数据

参数:同find同样

返回值:返回第一条匹配到的文档

5.5 获取集合对象

db.getCollection('class0') ==  db.class0

6 条件查找

6.1 比较操做符

=  >   <   >=  <=  !=

$eq 等于

计算 age=20 的记录

db.class0.find({age:{$eq:20}},{_id:0})

 

$lt     小于
$lte   小于等于
$gt    大于
$gte  大于等于
$ne   不等于

例如:

db.class0.find({age:{$gte:19,$lte:21}},{_id:0})

 

$in 包含

db.class0.find({age:{$in:[17,18,19]}},{_id:0})

 

$nin 不包含

db.class0.find({age:{$nin:[18,21]}},{_id:0})

 

6.2 逻辑操做符

and   or   not 

$and  逻辑与

db.class0.find({$and:[{name:'张三'},{age:19}]},{_id:0})

注:query 中逗号分割的多个条件默认就是and关系

 

$or  逻辑或

db.class0.find({$or:[{age:{$lt:19}},{age:{$gt:21}}]},{_id:0})

 

$not  逻辑非

db.class0.find({age:{$not:{$gt:20}}},{_id:0})

 

$nor  既不是也不是

db.class0.find({$nor:[{age:{$gt:20}},{sex:'男'}]},{_id:0})

 

6.3 混合查找

age  > 21  or  (namg = 张三  and  sex != 女)

db.class0.find({$or:[{age:{$gt:21}},{name:'张三',sex:{$not:{$eq:'女'}}}]},{_id:0})

db.class0.find({$or:[{age:{$gt:21}},{name:'张三',sex:{$nin:['女']}}]},{_id:0})
相关文章
相关标签/搜索