zoukankan      html  css  js  c++  java
  • MongoDB数据库

    MongoDB介绍

    什么是NoSQL?

    NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

    NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

    为什么使用NoSQL ?

    今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

    NoSQL的优点/缺点

    优点:

    • - 高可扩展性
    • - 分布式计算
    • - 低成本
    • - 架构的灵活性,半结构化数据
    • - 没有复杂的关系

    缺点:

    • - 没有标准化
    • - 有限的查询功能(到目前为止)
    • - 最终一致是不直观的程序

    什么是MongoDB ?

    MongoDB是一款NoSQL数据库

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

    在高负载的情况下,添加更多的节点,可以保证服务器性能。

    MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

    主要特点

    • 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中,一行纪录就是一个文档,它是一个由键值对构成的数据结构,MongoDB文档与JSON对象类似。键的值可以包含其他的文档,数组,文档数组。

    {
    "_id" : ObjectId("5a55c9857c1ccc05bc71e9b0"),
    "aid" : 2,
    "view" : "--",
    "danmaku" : 3564,
    "reply" : 3564,
    "favorite" : 2763,
    "coin" : 924,
    "share" : 1511,
    "now_rank" : 0,
    "his_rank" : 0,
    "no_reprint" : 0,
    "copyright" : 2
    }

    集合

    MongoDB在集合中存储文档。集合类似于关系数据库中的表。然而,与表不同的是集合不要求它里面的文档具有相同的结构。在MongoDB中,存储在集合中的文档必然有一个唯一的_id字段作为主键。

    Windows 平台安装 MongoDB

    MongoDB 下载

    MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center#community

    根据你的系统下载 32 位或 64 位的 .msi 文件,下载后双击该文件,按操作提示安装即可。

    安装过程中,你可以通过点击 "Custom(自定义)" 按钮来设置你的安装目录

    安装完之后

    创建数据目录

    MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下((如: C: 或者 D: 等 )。

    比如 我新建的目录为  D:/data/db 和 D:/data/log/mongod.log
    接下来新建mongod.cfg放到MongDB根目录下,mongod.cfg内容为

    systemLog:
    destination: file
    path: D:MongDBdatalogmongod.log
    storage:
    dbPath: D:MongDBdatadb

    其中path和dbpath分别为第二步新建的log文件夹和db文件夹的路径

    运行 MongoDB 服务

    从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件。

    配置mongoDB服务(以后可以在服务那里开启mongod服务或者设置为开机启动,不需要手动运行mongod.exe)

    通过执行mongod.exe,使用--install选项来安装服务,使用--config选项来指定之前创建的配置文件。
    命令:

    D:MongDBinmongod.exe --config D:MongDBmongod.cfg --install

    然后再启动服务

    net start MongDB

    另外,关闭MongoDB服务

    net stop MongoDB

    移除MongoDB 服务

    sc delete MongDB

    MongoDB 后台管理 Shell

    如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

    > mongo
    MongoDB shell version: 3.0.6
    connecting to: test
    ……

    Linux平台安装MongoDB

    MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包。

    下载地址:https://www.mongodb.com/download-center#community

    下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装) 。

    curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz    # 下载
    tar -zxvf mongodb-linux-x86_64-3.0.6.tgz                                   # 解压
    
    mv  mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb                         # 将解压包拷贝到指定目录
    

      

    MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:

    export PATH=<mongodb-install-directory>/bin:$PATH

    <mongodb-install-directory> 为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb 。


    创建数据库目录

    MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。

    以下实例中我们将data目录创建于根目录下(/)。

    注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。

    mkdir -p /data/db

    命令行中运行 MongoDB 服务

    你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。

    注意:如果你的数据库目录不是/data/db,可以通过 --dbpath 来指定。

    $ ./mongod
    2015-09-25T16:39:50.549+0800 I JOURNAL  [initandlisten] journal dir=/data/db/journal
    2015-09-25T16:39:50.550+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
    2015-09-25T16:39:50.869+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 3.16
    2015-09-25T16:39:51.206+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 3.52
    2015-09-25T16:39:52.775+0800 I JOURNAL  [initandlisten] preallocateIsFaster=true 7.7

    MongoDB后台管理 Shell

    如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。

    MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

    $ cd /usr/local/mongodb/bin
    $ ./mongo
    MongoDB shell version: 3.0.6
    connecting to: test
    Welcome to the MongoDB shell.
    ……

    数据库操作

    show dbs 查看当前所有的数据库
    use dbname 进入dbname数据库,没有就创建
    db.test.insert({'name':'jack'}) 创建test集合,并往其中插入数据(数据一般是字典类型){'name':'jack'}

    操作符

    1、比较操作符

    $gt 匹配大于(>)指定值的文档

    $gte 匹配大于等于指定值的文档

    $lt 匹配小于指定值的文档

    $lte 小于等于

    $ne 不等于

    $in 匹配数组中的任意值

    例:

    查找score大于等于80的数据

    db.find({'score':{$gte:80}})

    查找students是55,54,56中任一个的数据

    db.test.find({'students':{$in:[55,54,56]}})

    2、逻辑操作符

    $or 或条件查询

    查询students大于等于55或者title等于python_mongodb教学的文档

    db.test.find({$or:[{'students':{$gte:55}},{'title':'python_MongoDB教学'}]})

    $and 与条件查询

    $not 查询和表达式不匹配的文档

    $nor 查询与任一表达式都不匹配的文档

    db.test.find({$nor:[{'students':{$gte:57}},{'title':'python_MongoDB教学'}]})

    3、更新操作符

    $inc 将文档中的某个field对应的value自增/减某个数字amount

     db.test.update({'class':'python'},{$inc:{'students':1}})

    $mul 将文档中的某个field对应的value做乘法操作,同上。

    db.test.update({'score':60},{$mul:{'students':0.8}})

    $rename 重名名文档中指定的字段名字

    $set 更新文档中的某一个字段,而不是全部替换

    db.test.update({'students':116},{$set:{'students':56}})

    加上 {multi:true} 就会修改所有匹配条件的文档

    增删改查

    插入数据

    在MongoDB中,可以使用insert()方法和save方法插入一个文档到MongoDB集合中,如果此集合不存在,MongoDB会自动为你创建。先用命令行连接到MongoDB,再进入tz_mongo数据库。use tz_mongo然后插入一个文档到test集合,如果test集合不存在,这个操作会自己创建test集合。例如:

    > db.test.insert({'class':'python','students':50})
    > db.test.save({'class':'python','students':50})
    > db.test.find()
    { "_id" : ObjectId("5a586e8522dbc47846dd8e1f"), "class" : "python", "students" : 50 }
    { "_id" : ObjectId("5a586eae22dbc47846dd8e20"), "class" : "python", "students" : 50 }

    在插入的文档中,如果不指定_id参数,那么 MongoDB 会为此文档分配一个唯一的ObjectId。_id为集合中的每个文档唯一的12个字节的十六进制数。

    修改数据

    MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。update() 方法。

    update方法

    update方法用于更新已经存在的文档。

    我们先在test里面插入条数据,然后再进行修改。
    > db.test.insert({'title':'MongoDB教学'})
    WriteResult({ "nInserted" : 1 })
    > db.test.update({'title':'MongoDB教学'},{$set:{'title':'tz_MongoDB教学'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    然后再查看数据发现数据已经被修改。这里set的作用是指更新文档当中的某一个字段,如果不使用set,文档会被直接替换。update方法默认只更新一个文档.如果需要更新多个文档,需要指定multi参数

    save方法

    save() 方法通过传入的文档来替换已有文档。

    >db.test.save({'_id':ObjectId("5a586e8522dbc47846dd8e1f"),'class':'java','students':56})

    查询数据

    mongo查询数据使用的主要方法就是find。find方法以分结构化的方式来显示所有文档。find方法可以传入查询条件来进行数据查询。也可以不传。

    
    
    > db.test.find()
    默认返回20条数据
    > db.test.findOne()
    返回一条数据
    > db.test.find().limit(num)
    返回num条数据,不超过20条
    > db.test.find({'class':'爬虫1班'})
    通过给定的字段查询
    > db.test.find({'students':{$gte:58}})
    查询students大于等于58的数据
    > db.test.find({$or:[{'students':58},{'students':55}]})
    or操作符

    删除数据

    使用remove()方法从集合中删除文档。这个方法需要一个条件文档用来决定哪些文档将被删除。

    > db.test.remove({'class':'爬虫1班'})
    删除指定条件匹配的所有文件。
    > db.test.remove({'class':'爬虫1班'},{justOne:true})
    删除匹配条件的一条数据
    > db.test.remove({})
    删除当前文档
    > db.test.drop()
    删除集合

    删除操作也会返回一个WriteResult对象,他包含了操作的状态信息,nremoved字段值,表示被删除的字段数量。

    总结:

    db.test.insert(data)  #插入数据
    db.test.save(data) #保存数据,如果不存在就插入,若存在就修改(必须id也一样才是存在)
    
    db.test.remove(conditions) #删除指定条件匹配的所有数据
    db.test.remove(conditions,{justone:true}) #删除匹配条件的一条数据
    db.test.remove({}) #删除整个文档
    db.test.drop() #删除这个集合
    
    db.test.update({'name':'jack'},{$set:{'score':90}}) #把名字为jack的人的得分改为90
    db.test.update(conditions,{$set:newdata},{multi:true}) #update只修改一条,加上 {multi:true} 就会修改所有匹配条件的文档
    
    db.test.findone()
    db.test.find(conditions) #查找匹配条件的文档,默认最多返回20条
    db.test.find(conditions).limit(num) #查找匹配条件的文档,最多返回num条,num不超过20

    python操作mongoDB数据库

    使用pymongo这个第三方库

    安装:
    pip install pymongo

    使用

    """
    使用pymongo库操作MongoDB数据库
    """
    
    import pymongo
    
    # 1.连接数据库服务器,获取客户端对象
    mongo_client=pymongo.MongoClient('localhost',27017)
    
    # 2.获取数据库对象
    db=mongo_client.myDB
    # db=mongo_client['myDB']
    
    # 3.获取集合对象
    my_collection=db.myCollection
    # my_collection=db['myCollection']
    
    
    print("——"*50)
    # 插入文档
    tom={'name':'Tom','age':18,'sex':'','hobbies':['吃饭','睡觉','打豆豆']}
    alice={'name':'Alice','age':19,'sex':'','hobbies':['读书','跑步','弹吉他']}
    tom_id=my_collection.insert(tom)
    alice_id=my_collection.insert(alice)
    print(tom_id)
    print(alice_id)
    
    
    print("——"*50)
    # 查询文档
    cursor=my_collection.find()
    print(cursor.count())   # 获取文档个数
    for item in cursor:
        print(item)
    
    
    print("——"*50)
    # 修改文档
    my_collection.update({'name':'Tom'},{'$set':{'hobbies':['向Alice学习读书','跟Alice一起跑步','向Alice学习弹吉他']}})
    for item in my_collection.find():
        print(item)
    
    
    print("——"*50)
    # 删除文档
    # my_collection.remove({'name':'Tom'},{'justOne':0})
    my_collection.remove()
    for item in my_collection.find():
        print(item)

    注意 mongodb里的数据都是字典格式的。

    补充

    多条插入:

     1 >>> new_posts = [{"author": "Mike",
     2 ...        "text": "Another post!",
     3 ...        "tags": ["bulk", "insert"],
     4 ...        "date": datetime.datetime(2009, 11, 12, 11, 14)},
     5 ...       {"author": "Eliot",
     6 ...        "title": "MongoDB is fun",
     7 ...        "text": "and pretty easy too!",
     8 ...        "date": datetime.datetime(2009, 11, 10, 10, 45)}]
     9 >>> result = posts.insert_many(new_posts)
    10 >>> result.inserted_ids
    11 [ObjectId('...'), ObjectId('...')]

    获取集合的数据条数:

    >>> collection.count()

    或者说满足某种查找条件的数据条数:

    >>> collection.find({"author": "Mike"}).count()

    查询结果排序

    >>> db.Account.find().sort("UserName") #默认为升序
    >>> db.Account.find().sort("UserName",pymongo.ASCENDING)  #升序
    >>> db.Account.find().sort("UserName",pymongo.DESCENDING) #降序

    查询结果多列排序

    >>> db.Account.find().sort([("UserName",pymongo.ASCENDING),("Email",pymongo.DESCENDING)])

    修改多级字段数据

    假如要把这样一条数据

     {
              "_id" : ObjectId("58121b864c26bf241b000056"),
              “teacher":"MrWang"
              "student" : {
                           "grades" : {
                           "math" : 90,
                           "English" : 80,
                           "Chinese" : 70,
                     }
                  }
            }
    中的math的值改为80,该如何做呢
    利用符号"."来分级
    collection.update({"_id":ObjectId("58121b864c26bf241b000056")},{"$set":{"student.grades.math":80}})
  • 相关阅读:
    docker镜像操作
    利用docker搭建lnmp平台
    算法导论笔记
    算法导论笔记
    VMware 安装CentOS 7 NAT模式 配置静态ip 连接外网 xshell连接虚拟机
    spring boot入门笔记(四)
    spring boot入门笔记 (三)
    spring boot入门笔记 (二)
    spring boot入门笔记 (一)
    修改request请求参数
  • 原文地址:https://www.cnblogs.com/woaixuexi9999/p/9260814.html
Copyright © 2011-2022 走看看