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}})
  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/woaixuexi9999/p/9260814.html
Copyright © 2011-2022 走看看