技术栈 | MongoDB的最合理用法


    概要
    为什么要用Mongodb数据库呢?
    怎么安装以及使用Mongodb?
    NoSQL的简介:
    NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
    在现代的计算系统上每天网络上都会产生庞大的数据量。
    这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。1970年E.F.Codd's提出的关系模型的论文"A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。
    通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。
    NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
    对于一名程序员来说,使用NoSQL应成为一条必备技能。
    关系型和非关系型的介绍:
    
    对于关系型数据库,存储数据的时候需要提前建表建库,随着数据的复杂度越来越高,所建的表的数量也越来越多,但是非关系型却不需要。
    
    什么是MongoDB?
    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
    在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于JSON 对象。字段值可以包含其他文档,数组及文档数组。
    
    MongoDB的特点:
    MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
    你可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
    你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
    如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
    Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
    MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
    Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
    Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
    Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
    GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
    MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
    MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
    MongoDB安装简单
    MongoDB的优势:
    易扩展:NoSQL数据库种类繁多,但是都有一个共同的特点都是去掉去掉关系数据型特性。数据之间无关系,这样就非常容易扩展。
    大数据量,高性能:NoSQL数据库都有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系型,数据库的结构简单。
    灵活的数据模型:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
    MongoDB的安装:
    6.1命令的安装
    sudo apt-get install -y mongodb
    6.2源码安装
    
    6.3 服务器mongodb的启动
    启动方式1:
    启动:sudo service mongod start(sudo service mongodb start,mongod 改为mongodb。下同)
    停止:sudo service mongodb stop
    重启:sudo service mongodb restart
    配置文件的位置:/etc/mongod.conf
    日志的位置:/var/log/mongodb/mongod.log
    默认端口:27017
    启动方式2:
    启动:sudo mongod [--dbbath=dbpath –logpath=logpath –-append -fork] [ -f logfile]
    只以sudo mongod命令启动时,默认将数据存放在了/data/db目录下,需要手动创建
    --dnpath:指定数据的存放路径
    --logpath:指定日志的存放路径
    --logappend:设置日志的写入形式为追加模式
    -fork:开启新的进程运行mongodb服务
    f:配置文件(可以将上述配置信息 写入文件然后通过本参数进行加载启动)
    6.4 客户端mongodb
    启动本地客户端:mongo
    查看帮助:mongo-help
    退出:exit或者ctrl+c
    为什么要进行权限管理的设置?
    刚安装完毕的mongodb默认不使用权限认证方式启动,与MySQL不同,mongodb在安装的时候并没有设置权限,然而公网运行系统需要设置权限以保证数据安全。
    Mongodb超级管理员账号的创建
    8.1以权限认证的方式启动mongodb数据库
    sudo mongod  --auth
    8.2启动之后在启动信息会有如下信息,说明mongodb以权限认证的方式启动成功
    [initandlisten] options: { security: { authorization: "enabled" } }
    8.3创建超级用户 使用admin数据库(超级管理员账号必须创建在改数据库上)
    use admin
    创建超级用户
    db.createUser({"user":"python","pwd":"python","roles":["root"]})
    创建成功后会显示如下信息
    uccessfully added user:{"user":"python","roles":["root"]}
    8.4退出客户端再次登录验证 此时再使用数据库各命令的时候,会报权限错误,需要认证才能执行相应操作
    user admin
    db.auth(‘python’,’python’)
    1
    Python 用户创建在admin数据库上的所以必须来到admin数据库上进行认证,认证成功会返回1,失败返回0
    创建普通用户
    9.1选择需要创建用户的数据库
    use test1
    9.2 在使用的数据库上创建普通用户
    db.createUser("user":"user1", "pwd":"pwd1", roles:["read"])
    创建普通用户user1,该用户在test1上的权限是只读
    db.createUser("user":"user1", "pwd":"pwd1", roles:["readWrite"])
    创建普通用户user1,该用户在test1上的权限是读写
    9.3 在其他数据库上创建普通用户
    Useradmin
    db.createUser({“user”:”python1”,”pwwd”:”python1”,roles:[{“role”:”read”,”db”:dbname1},{“role”:”
    readWrite”,”db:”dbname2”}]})
    在admin上创建python1用户,python1用户的权限有两个,一个在dbname1上只读,另一个是在dbname2上的读写
    查看创建的用户
    show users
    {
    “id”:”admin.python”,
    “user”:”python”,
    “db”:”admin”,
    “roles”:[
    {
    “role”:”root”,
    “db”:”admin”
    }]
    }
    删除用户
    db.dropUser(‘python’)
    Mongodb中常见的数据类型
    11.1 常见类型
    Object ID:文档ID
    String:字符串,最常用,必须是有效的UTF-8
    Boolean:存储一个布尔值,true或false
    Integer:整数可以是32位活着64位,这取决于服务器
    Double:存储浮点值
    Arrays:数组或列表,多个值存储到一个键
    Object:用于嵌入式的文档,即一个值为一个文档
    Null:存储Null值
    Timestamp:时间戳,表示从1970-1-1到现在的总秒数
    Date:存储当前日期或时间的UNIX时间格式
    11.2注意点
    每个文档都有一个属性,为_id,保证每个文档的唯一性,mongodb默认使用_id为主键。
    可以自己去设置_id插入文档,如果没有提供,那么mongodb为每个文档提供了一个独特的_id,类型为objectID
    objectID是个12字节的六进制数,每个字节两位,一共是24 位的字符串: 前4个字节为当前时间戳 接下来3个字节的机器ID 接下来的2个字节中MongoDB的服务进程id 最后3个字节是简单的增量值。
    Mongodb中常见的增删改查
    12.1 mongodb的插入
    db.Collectionname.insert(document)
    db.stu.insert({name:”ll”,gender:1})
    db.stu.insert({_id:”1111”,name:”ll”,gender:1})
    插入文档时,如果不指定_id参数,Mongodb会为文档分配一个唯一的Oobjectid
    12.1 mongodb的保存
    命令:db.Collectionname.save(document) 如果?档的_id已经存在则修改, 如果?档的  _id不存在则添加
    12.2 mongodb的简单查询
    命令:db.Collectionname.find()
    12.3 mongodb的更新
    db.Collectionname.update(
    参数query:查询条件
    参数update:更新操作符
    参数multi:可选,默认时false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
    db.stu.update({name:'hr'},{name:'mnc'})           全文档进行覆盖更新
    db.stu.update({name:'hr'},{$set:{name:'hys'}})    指定键值更新操作
    db.stu.update({},{$set:{gender:0}},{multi:true})   更新全部
    12.4mongodb的删除
    db. Collectionname.remove(
    参数query:可选,删除的文档的条件
    参数query:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
    Mongodb和python交互
    Pymongo提供了mongdb和python交互的所有方法,安装方式:
    Pip install pymongo
    13.1 使用mongodb,导入pymongo并选择要操作的集合
    数据库和集合会自动创建
    from pymongo import MongoClient
    client = MongoClient(host,port)
    collection = client[db名][集合名]
    13.2添加数据
    Insert可以批量的插入数据列表,也可以插入一条数据
    collection.insert([{"name":"test10010","age":33},{"name":"test10011","age":34}]/{"na me":"test10010","age":33})
    13.3添加一条数据
    ret = collection.insert_one({"name":"test10010","age":33})
    print(ret)
    13.4添加多条数据
    item_list = [{"name":"test1000{}".format(i)} for i in range(10)]
    #insert_many接收一个列表,列表中为所有需要插入的字典
    t = collection.insert_many(item_list)
    13.4查找一条数据
    #find_one查找并且返回一个结果,接收一个字典形式的条件
    t = collection.find_one({"name":"test10005"})
    print(t)
    13.5 查找全部数据
    结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,但是只能够进行一次读取
    #find返回所有满足条件的结果,如果条件为空,则返回数据库的所有t = collection.find({"name":"test10005"})#结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针
    for i in t:    print(i)for i in t: #此时t中没有内容    print(i)
    13.6更新一条数据
    #update_one更新一条数据collection.update({"name":"test10005"},{"name":"new_test10005"},multi=True/False)
    13.7更新一条数据(注意使用$set命令)
    #update_one更新一条数据collection.update_one({"name":"test10005"},{"$set":{"name":"new_test10005"}})
    13.8更新全部数据
    # update_one更新全部数据collection.update_many({"name":"test10005"},{"$set":{"name":"new_test10005"}})
    13.9插入更新数据
    #update_one更新一条数据collection.update({"name":"test10005"},{"$set":{"name":"new_test10005"}},upsert=True)13.10删除一条数据#delete_one删除一条数据collection.delete_one({"name":"test10010"})13.11 删除全部数据#delete_may删除所有满足条件的数据collection.delete_many({"name":"test10010"})
    13.10删除一条数据
    #delete_one删除一条数据
    collection.delete_one({"name":"test10010"})
    13.11 删除全部数据
    #delete_may删除所有满足条件的数据
    collection.delete_many({"name":"test10010"})
    总结:以上就是Mongodb的简单使用,在大数据时代,对数据的保存也越来越重视,非关系型数据库大大减少了我们工作的负担。