zoukankan      html  css  js  c++  java
  • Mongodb 的操作

    NoSQL Mongodb

    NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

    MongoDB是一个介于关系型数据和非关系型数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,其数据结构由键值(key=>value)对组成。

    MongoDB 将数据存储为一个文档,MongoDB 文档类似于 JSON 对象。因此可以存储比较复杂的数据类型。

    MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库表单查询的绝大部分功能。

    安装mangoDB

    cd Software/
    #解压
    tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.6.0.tgz 
    #配置环境变量
    sudo vim ~/.bashrc
    #在末尾添加如下内容
    export MONGODB_HOME=/home/rock/Software/mongodb-linux-x86_64-ubuntu1604-3.6.0
    export PATH=$MONGODB_HOME/bin:$PATH
    #刷新环境变量
    source ~/.bashrc
    #验证环境变量
    echo $PATH
     

    启动

    1、mongod 启动,需要根目录下存在data/db路径,但是通常用户是没有权限去操作根路径中的文件

    2、自己创建数据库的存储位置,在我们拥有权限的文件夹中,创建data/db目录结构

    3、启动:

    mongod --dbpath /home/rock/data/db

    4、注意后面存储的是自己的路径

    连接

    1、mongo 直接连接

    安装图形化

    tar -zxvf studio-3t-linux-x64.tar.gz

    ./ studio-3t-linux-x64.sh

    基本操作

    SQL术语/概念MongoDB术语/概念解释/说明
    database database 数据库
    table collection 数据库表/集合
    row document 数据记录行/文档
    column field 数据字段/域
    index index 索引
    table joins   表连接,MongoDB不支持
    primary key primary key 主键,MongoDB自动将_id字段设置为主键

    MongoDB中常用的几种数据类型:

    • Object ID:文档ID

    • String:字符串,最常用,必须是有效的UTF-8

    • Boolean:存储一个布尔值,true或false

    • Integer:整数可以是32位或64位,这取决于服务器

    • Double:存储浮点值

    • Arrays:数组或列表,多个值存储到一个键

    • Object:用于嵌入式的文档,即一个值为一个文档

    • Null:存储Null值

    • Timestamp:时间戳

    • Date:存储当前日期或时间的UNIX时间格式

    数据库操作

    > db
    test
    > use learn
    switched to db learn
    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    > db.student.insert({"name":"daisy"})
    WriteResult({ "nInserted" : 1 })
    > show dbs
    admin   0.000GB
    config  0.000GB
    learn   0.000GB
    local   0.000GB
    > db
    learn
    > db.getName()
    learn
    > db.student.insert({'eat':'土豆'})
    WriteResult({ "nInserted" : 1 })
    > db.student.find()
    { "_id" : ObjectId("5b188ff933d2607cbb01596b"), "name" : "daisy" }
    { "_id" : ObjectId("5b18907933d2607cbb01596c"), "eat" : "土豆" }
    > 
     

    创建数据库:

    use 数据库名 有的就是切换,没有就是创建

    查看当前数据库:

    db

    db.getName()

    查看所有数据库:

    show dbs

    删除数据库:

    db.dropDatebase()

     

    集合操作

    插入一条数据:

    db.student.insert({key:value})

    db.student.insertone({key:value})

    插入多条数据:

    db.student.insertMany([{key:value},{key:value}....])

    db.student.insertMany([{'name':'zhangsan','age':24},{'name':'lisi','hobby':'MUSIC'}])

    大括号代表document,相当于mysql中的row。document中的key:value,key是field,相当于mysql中的column列。

    查询

    查询所有:

    db.student.find()

    条件查询:

    db.student.find(query,projection)

    query 可选,查询条件

    projection 可选,字段过滤,默认返回所有字段

    字段为0,为不需要返回

    字段为1,为需要返回

    投射里 除了_id以外,要么全是1,要么全是0,否则就报错

     
    > db.student.find({'name':'lisi'})
    { "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
    { "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "age" : 18, "hobby" : "sleep" }
    { "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "age" : 18, "hobby" : "wangzhe" }
    > db.student.find({'name':'lisi'},{'age':1})
    { "_id" : ObjectId("5b1896db33d2607cbb015971") }
    { "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
    { "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
    > db.student.find({'name':'lisi'},{'age':0})
    { "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
    { "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "hobby" : "sleep" }
    { "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "hobby" : "wangzhe" }
    > 
    > db.student.find({'name':'lisi'},{'age':1})
    { "_id" : ObjectId("5b1896db33d2607cbb015971") }
    { "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
    { "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
    > db.student.find({'name':'lisi'},{'age':0})
    { "_id" : ObjectId("5b1896db33d2607cbb015971"), "name" : "lisi", "hobby" : "MUSIC" }
    { "_id" : ObjectId("5b1899a333d2607cbb015972"), "name" : "lisi", "hobby" : "sleep" }
    { "_id" : ObjectId("5b1899b033d2607cbb015973"), "name" : "lisi", "hobby" : "wangzhe" }
    > db.student.find({'name':'lisi'},{'age':0,'hobby':1})
    Error: error: {
        "ok" : 0,
        "errmsg" : "Projection cannot have a mix of inclusion and exclusion.",
        "code" : 2,
        "codeName" : "BadValue"
    }
    > db.student.find({'name':'lisi'},{_id:0})
    { "name" : "lisi", "hobby" : "MUSIC" }
    { "name" : "lisi", "age" : 18, "hobby" : "sleep" }
    { "name" : "lisi", "age" : 18, "hobby" : "wangzhe" }
    > db.student.find({'name':'lisi'},{'age':1})
    { "_id" : ObjectId("5b1896db33d2607cbb015971") }
    { "_id" : ObjectId("5b1899a333d2607cbb015972"), "age" : 18 }
    { "_id" : ObjectId("5b1899b033d2607cbb015973"), "age" : 18 }
    > db.student.find({'name':'lisi'},{'age':1,_id:0})
    {  }
    { "age" : 18 }
    { "age" : 18 }
    > db.student.find({'name':'lisi'},{'age':0,_id:0})
    { "name" : "lisi", "hobby" : "MUSIC" }
    { "name" : "lisi", "hobby" : "sleep" }
    { "name" : "lisi", "hobby" : "wangzhe" }
    > 
     

    操作符

    常用操作符query的值

    等于 {key:value}

    小于 {key:{$lt:value}}

    小于等于 {key:{$lte:value}}

    大于 {key:{$gt:value}}

    大于等于 {key:{$gte:value}}

    不等于 {key:{$ne:value}}

     
    > db.person.find({'age':{$gt:8}})
    { "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    > 
     

    模糊查询

    查询条件的value值,支持正则表达式,实际上是实现的就是关系型数据库中的like

     
     
     
     
     
    > db.person.find({'name':/.*d.*/})
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
     

    or 和 and

    $or:

    db.集合名.find({$or : [{key:value},{key:value}]})

    多条件or(或)使用,就是查询中使用$or,$or对应的就是列表,方括号里面query条件

     
     
    > db.person.find({'name':'刘帅','age':20})
    { "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
    > db.person.find({$or : [{'name':'daisy'},{'age':20}]})
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
    > 
     

    limit、skip、sort

    sort :排序,1代表升序,-1代表降序

     
    > db.person.find().sort({'age':1})
    { "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
    { "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
    > db.person.find().sort({'age':-1})
    { "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
    { "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
    > 
     

    limit ()

     
    > db.person.find().limit(2)
    { "_id" : ObjectId("5b189c9333d2607cbb015974"), "name" : "刘帅", "age" : 99 }
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
     

    skip ():跳过结果集的多少条,分页的第二页就是认为跳过第一页的条数

    混合写

    当同时使用sort、limit、skip的时候,无论位置先后,都是先sort,再skip,最后limit

     
    > db.person.find().limit(2).sort({'age':1}).skip(1)
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
    > 
     

    聚合

     
    > db.person.aggregate([{$group:{"_id":null,age_sum:{$sum:"$age"}}}])
    { "_id" : null, "age_sum" : 143 }
     

    使用小窍门:key-value ,value只要不是具体的直接的值,就需要冒号之后使用大括号{}

    数据删除

    1、数据删除

    db.集合名字.deleteOne(query) 删除一条数据,第一条匹配到的数据

    db.集合名字.deleteMany(query) 删除所有匹配的数据

    > db.person.deleteOne({'name':'刘帅'})
    { "acknowledged" : true, "deletedCount" : 1 }
    > db.person.find()
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
    { "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
    > db.person.insert({'name':'刘帅','hobby':'吸烟'})
    WriteResult({ "nInserted" : 1 })
    > db.person.insert({'name':'刘帅','hobby':'喝酒'})
    WriteResult({ "nInserted" : 1 })
    > db.person.find()
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
    { "_id" : ObjectId("5b189eae33d2607cbb015977"), "name" : "刘帅", "age" : 20 }
    { "_id" : ObjectId("5b18a67a33d2607cbb015978"), "name" : "刘帅", "hobby" : "吸烟" }
    { "_id" : ObjectId("5b18a68233d2607cbb015979"), "name" : "刘帅", "hobby" : "喝酒" }
    > db.person.deleteMany({'name':'刘帅'})
    { "acknowledged" : true, "deletedCount" : 3 }
    > db.person.find()
    { "_id" : ObjectId("5b189c9333d2607cbb015975"), "name" : "daisy", "age" : 16 }
    { "_id" : ObjectId("5b189c9333d2607cbb015976"), "name" : "tudou", "age" : 8 }
    > 
     

    数据更新

    默认只修改第一条文档,如果要修改多条相同的文档,需要设置multi:true

     
     
    > db.person.update({'name':'daisy'},{$set:{'age':999}})
    > db.person.update({'name':'刘帅'},{$set:{'hobby':'tangtou'}},{multi:true})
    WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
     
  • 相关阅读:
    Apache服务器的安装与配置
    更改Apache默认起始(索引)页面:DirectoryIndex
    cmd那个命令是查看端口情况的?
    apache不能启动LoadModule php5_module modules/ph
    AddHandler php5-script .phpAddType text/html .php和AddType application/x-httpd-php .php的区别?
    动态创建二维vector数组 C和C++ 及指针与引用的区别
    理解KMP
    C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法----细节决定成败 (sort用法)
    数据库索引
    fork()函数详解
  • 原文地址:https://www.cnblogs.com/gugubeng/p/9714583.html
Copyright © 2011-2022 走看看