zoukankan      html  css  js  c++  java
  • MongoDB

    一 MongoDB的简介

    1 MongoDB是什么

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
    它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
    关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念
    MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦

    2 MongoDB数据存储格式

    JSON格式
      JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。
      MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。JSON数据库语句可以容易被解析。

    BSON格式
    SON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
      二进制的JSON,JSON文档的二进制编码存储格式
      BSON有JSON没有的Date和BinData
      MongoDB中document以BSON形式存放
           db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});

     3 MongoDB适用场景

    网站数据、缓存等大尺寸、低价值的数据
    在高伸缩性的场景,用于对象及JSON数据的存储。

    4 与关系型数据库的概念映射

    表           table         Collection
    字段       Colum       Fields
    行           Row          Documents

    二 MongoDB安装与部署

     1 安装

    MongoDB官网:https://www.mongodb.com/
    CentOS7.X版本软件下载地址https://www.mongodb.org/dl/linux/x86_64-rhel7
    在root用户下操作 # 该方法仅限与CentOS系统使用

    cat >> /etc/rc.local <<'EOF'
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
       echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
    EOF

    Transparent Huge Pages (THP),通过使用更大的内存页面,可以减少具有大量内存的机器上的缓冲区(TLB)查找的开销。
    但是,数据库工作负载通常对THP表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。

    创建用户

    groupadd -g 800 mongod
    useradd  -u 801 -g mongod  mongod    

    修改用户密码

    echo 123456 |passwd --stdin  mongod

    创建程序目录

    mkdir -p /application/mongodb/   &&
    cd  /application/mongodb/   &&
    mkdir  -p  bin  conf  log  data

    下载程序

    cd  /application/mongodb/
    wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz

    解压程序

    tar xf  mongodb-linux-x86_64-3.2.8.tgz
    cd mongodb-linux-x86_64-3.2.8/bin/ &&
    cp * /mongodb/bin

    修改程序属主

    chown -R mongod:mongod /application/mongodb

    切换到mongod用户,设置用户环境变量

    su - mongod
    cat >> .bash_profile <<'EOF'
    export PATH=/mongodb/bin:$PATH
    EOF
    source .bashprofile

    2 管理MongoDB

    启动:mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
    关闭:mongod --shutdown  --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork

    3 登录数据库

    [mongod@MongoDB ~]$ mongo
    MongoDB shell version: 3.2.8
    connecting to: test
    >

    4 使用配置文件的方式管理数据库

    cd /application/mongodb/conf/
    [mongod@MongoDB conf]$ vim mongod1.conf 
    dbpath=/application/mongodb/data
    logpath=/application/mongodb/log/mongodb.log
    port=27017
    logappend=1
    fork=1
    使用配置文件时的启动与关闭:
      启动:mongod -f mongod1.conf 
      关闭:mongod -f mongod1.conf  --shutdown

    三 MongoDB的基本操作

    Mongodb中关键字种类:

    db(数据库实例级别)
      db本身
        db.connection 数据库下的集合信息
          db.collection.xxx(
    rs(复制集级别)
    sh(分片级别)

    1 查询操作

    在客户端指定数据库进行连接:

    [mongod@MongoDB ~]$ mongo 10.0.0.152/admin
    MongoDB shell version: 3.2.8
    connecting to: 10.0.0.152/admin
    > db
    admin

    查看当前数据库版本

    > db.version()
    3.2.8

    切换数据库

    > use test;
    switched to db test

    显示当前数据库

    > db
    test
    > db.getName()
    test

    查询所有数据库

    > show dbs;
    clsn   0.000GB
    local  0.000GB
    test   0.000GB
    > show databases;
    clsn   0.000GB
    local  0.000GB
    test   0.000GB

    查看clsn数据库当前状态

    > use clsn;
    > db.stats()
    {
        "db" : "clsn",
        "collections" : 1,
        "objects" : 10000,
        "avgObjSize" : 80,
        "dataSize" : 800000,
        "storageSize" : 258048,
        "numExtents" : 0,
        "indexes" : 1,
        "indexSize" : 94208,
        "ok" : 1
    }

    查看当前数据库的连接机器地址

    > db.getMongo()
    connection to 127.0.0.1

    2 数据库管理

    创建数据库

    当use的时候,系统就会自动创建一个数据库。如果use之后没有创建任何集合。系统就会删除这个数据库。
    > use clsn;

    删除数据库

    > show dbs;
    clsn   0.000GB
    local  0.000GB
    test   0.000GB
    > use clsn 
    switched to db clsn
    > db.dropDatabase()
    { "dropped" : "clsn", "ok" : 1 }

    3 创建集合

    方式一:

    > use clsn;
    switched to db clsn
    > db.createCollection('a')
    { "ok" : 1 }
    > db.createCollection('b')
    { "ok" : 1 }
    查看当前数据下的所有集合
    > show collections;
    a
    b
    > db.getCollectionNames()
    [ "a", "b" ]

    方式二:

    当插入一个文档的时候,一个集合就会自动创建。
    > use clsn;
    switched to db clsn
    > db.c.insert({name:'clsn'});
    WriteResult({ "nInserted" : 1 })
    > db.c.insert({url:'http://blog.nmtui.com'});
    WriteResult({ "nInserted" : 1 })
    
    查看集合里的内容
    > db.c.find()
    { "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" }
    { "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" }

    4 添加数据

    db.tablename.insert({'key':'value'})
    官方推荐的写法:
    #在图形化客户端和数据库中是这个写法
    db.table.insertOne({'key':'value'})
    db.table.insertMany({k1:v1},{k2:v2},,{k3:v3})
    #在pycharm中的写法为
    db.tablename.insert_one({})
    db.tablename.insert_many({},{},{})

    5 删除数据

    db.tablename.remove({k:v})
    db.tablename.remove({age:34}) #删除所有age=34的数据
     
    官方推荐的写法:
    #数据库和图形化操作写法
    db.tablename.deleteOne()  #删除符合条件的第一条数据
    db.tablename.deleteMany() # 删除符合条件的所有数据
    
    #在pycharm中的写法为
    db.tablename.delete_one({})
    db.tablename.delete_many({},{},{})

    6 更新数据

    #查询出name为xx的数据,将符合条件的一条数据进行修改
    db.tablename.update({name:'xx'},{$set:{age:23}})
    $set -set修改器   强制替换覆盖
    官方推荐写法 #数据库和图形化操作的写法  #更新符合条件的第一条数据,第一条数据就是你第一个插入的数据
    db.tablename.update_many({},{}) array(数组,列表) + object(字典) :db.tablename.updateOne({cp.name:'装X'},{$set:{cp.$.score:'100'}}) #此处cp.$.score,$的意思为前面查询出的索引

    7 查询操作

    db.filename.find()  #查询所有数据
    db.user.find({name:xixi}) #查询出name为xixi的数据
    #查询符合条件的一条数据
    db.tablename.findOne({k:v})

    四 MongoDB的数据类型

    ObjectId :Documents 自动生成的 _id
    _id:ObjectId("5cb69a23815ea7295f8bad43") 自动生成的 json数据中不包含ObjectId类型 id类型uuid
    String: 字符串,必须是utf-8
    Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
    Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
    Double:浮点数 (没有float类型,所有小数都是Double)
    Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
    Object:深度<=4 如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
    Null:空数据类型 , 一个特殊的概念,None Null
    Timestamp:时间戳 通常不用这个数据类型 如果存储时间 Double
    Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)

    五 查询关键字

    array数据类型会自动遍历
    $in 或者等于相同字段 db.filename.fiind({age:{$in:[19,109]}})         #就是age=19或age=109的数据 
    $or 或者等于不同字段 db.filename.find({$or:[{age:19},{age:109}] })    #也是age=19或age=109的数据,与$in不同之处在于 ,$in写的必须是相同的字段,而$or可以写不同的字段
    $and or 逗号  -- 并列条件
    $all --Array 数据类型 子集查询 db.filename.find({hobby:{$all : [ 'cs','harry' ]}})

    六 修改器

    数学比较:

    $lt : 小于 √
    $lte: 小于等于 √
    $gt : 大于 √
    $gte: 大于等于 √ 
    $ne : 不等于
    $eq or 冒号 : 等于

    $set -- set修改器   强制替换覆盖

    db.user.updateOne({name:"harry"},{$set:{name:"cs"}})

    $unset  -- 强制删除字段

    db.user.updateOne({name:"harry"},{$unset:{gender:0}})

    $inc    -- 引用增加   #就相当于我查询出的数据进行增加,没有减,如果想实现减的操作,加负的即可

    db.user.updateOne({name:"harry"},{$inc:{age:1}}) # 年龄加1

     array操作:

    $push  相当于append  在array中追加

    db.user.updateOne({name:"harry"},{$push:{hobby:"养生"}})  # 添加一个元素
    db.user.updateOne({name:"harry". hobby:"养生"},{$set:{"hobby.$":"健身养生"}})  # 把养生修改成健身养生  $:满足前置条件列表元素的下标索引

    $pushAll    相当于extend  在array中追加列表中的所有元素

    db.user.updateOne({name:"harry"},{$pushAll :{hobby:["养生", "健身"]}})

    $pull       相当于remove  在array中删除一个元素

    db.user.updateOne({name:"harry"},{$pull:{hobby:"游戏"}}) 

    $pullAll    在array中删除一堆元素

    $pop  相当于pop 删除第一个 -1 或 最后一个 1 的值

    {$pop:{myczdyy:-1}} 在myczdyy中删除第一个元素
    {$pop:{myczdyy:1}} 在myczdyy中删除最后一个元素

    混搭用法示例:

    db.user.updateOne({name:'cs'},{$set:{course:[
        {course_name:"Python", score:101},
        {course_name:"Vue.js", score:2},
        {course_name:"Mysql", score:98}
    ]}})
    
    db.user.updateOne({name:"cs", "course.course_name":"Vue.js"}, {$inc:{"course.$.score":10}}) # 把VUE的成绩+10

     七 sort(排序) skip(跳过) limit(选取条目)

    sort 排序

    #找到name为xixi的数据,根据age排序
    db.filename.find({name:xixi}).sort({age:18})
     
    #找到name为xixi的数据,根据age排序,如果age有相同的,再根据birthday倒序排序
    db.filename.find({name:xixi}).sort({age:18,birthday:-1})

    skip 跳过

    #找到name为xixi的数据,然后根据插入顺序跳过第一条
    db.filename.find(name:xixi).skip(1)

    limit 选取条目

    #找到name为xixi的数据,根据插入顺序选取出3条数据展示
    db.filename.find({name:xixi}).limit(3)

    sort,limit,skip是有执行顺序的
    先排序(sort),在跳过(skip),最后显示条目(limit)

    实现分页:

    (page-1)*num
    db.filename.find({name:xixi}).skip((page-1)*num).limit(num)

    八 pymongo

    安装 pip install  pymongo

    # 创建客户端

    mongo_client = pymongo.MongoClient(host="127.0.0.1", port=27017)
    mongo_db = mongo_client['my_mongo_db']

    # 查询数据

    res = mongo_db.user.find() # cursor对象 可被迭代
    for i in res:
        print(i)

    # 查询单条数据

    res = mongo_db.user.find_one()

    # 带条件查询

    res = mongo_db.user.find_one({"name":"cs"})

    # 插入数据

    res = mongo_db.user.insert_one({"name":"harry"})
    res = mongo_db.chat.insert_one({})

    # 插入多条

    res = mongo_db.user.insert_many([{'name':'harry'}, {'name':'sam'}, {'name':'jerry'}])

    # 修改数据

    res = mongo_db.user.update_one({"name":"jerry"},{"$set":{"age":999}})  # 返回UpdateResult对象

    # 修改多条

    res = mongo_db.user.update_many({"age":{"$gte":0}}, {"$set":{"age":888}}

    # 删除

    res = mongo_db.user.delete_one({"name":"sam"}) # 删除一条数据
  • 相关阅读:
    Linux 实用指令(5)--组管理和权限管理
    Linux 实用指令(4)
    Linux用户管理 (3)
    Oracle如何用单字段或多字段进行查重
    SQL中的左连接与右连接,内连接有什么不同
    Markdown语法--整理
    应用程序无法正常启动0xc000007b
    Linux开机、重启和用户登录注销(2)
    Linux vi和vim编辑器(1)
    SecureCRT 64位 破解版和安装,以及解决乱码问题
  • 原文地址:https://www.cnblogs.com/harryblog/p/11122314.html
Copyright © 2011-2022 走看看