美文网首页
【MongoDB】入门-实验楼篇

【MongoDB】入门-实验楼篇

作者: 一个好汉 | 来源:发表于2021-08-06 22:09 被阅读0次
    MongoDB

    本地没有安装MongoDB可以在实验楼上学习的
    地址:实验楼

    虚拟机开机配置

    启动 MongoDB 服务,因为 MongoDB 并不随系统一起启动,可能以下命令运行后会等一小段的时间才会启动完毕。

    sudo service mongodb start
    

    进入 MongoDB 命令行操作界面(可能会出现 connect failed,多试几次就行),在命令行中敲 exit 可以退出。

    mongo
    

    实验中的布尔类型的 ture 用 1 代替,false 用 0 代替。

    基本概念

    数据库

    一个 MongoDB 可以创建多个数据库
    使用 show dbs 可以查看所有数据库的列表
    执行 db 命令则可以查看当前数据库对象或者集合
    运行 use 命令可以连接到指定的数据库

    $ mongo    # 进入到mongo命令行
    use test    # 连接到test数据库
    

    注意:数据库名可以是任何字符,但是不能有空格、点号和 $ 字符。

    集合

    集合就是一组文档的组合,就相当于是关系数据库中的表,在 MongoDB 中可以存储不同的文档结构的文档。

    例如:

    {"company":"Chenshi keji"} {"people":"man","name":"peter"}

    上面两个文档就可以存储在同一个集合中,在关系型数据库中是很难实现上述数据结构的,要么需要定义大量的字段,对于一些字段名不确定的属性,关系型数据库会更加力不从心。

    MongoDB 的做法也不是完美的。比如在存储用户信息的时候,用户名和密码分别用 username 和 password 字段表示。 关系型数据库只需要把字段名作为表结构的一部分保存起来就可以了,而 MongoDB 需要将这两个字段名存储多次,每一条记录都会存储一次字段名,在一些原本就比较碎片化的字段上,用于存储字段名所耗费的空间甚至会超过存储数值的空间,比较好的解决办法是采用尽可能短的字段名,不过这又涉及到了可读性的问题,需要大家在二者之间进行权衡。

    文档

    文档是 MongoDB 的核心,类似于 SQLite 数据库(关系数据库)中的每一行数据。多个键及其关联的值放在一起就是文档。在 Mongodb 中使用一种类 json 的 bson 存储数据,bson 数据可以理解为在 json 的基础上添加了一些 json 中没有的数据类型。

    文档逻辑体系

    假设有两个文档

    # user文档
    {
       "name": "Tom Hanks",
       "contact": "987654321",
       "dob": "01-01-1991"
    }
    
    # address文档
    {
       "building": "22 A, Indiana Apt",
       "pincode": 123456,
       "city": "chengdu",
       "state": "sichuan"
    }
    
    嵌入
    # 这就是嵌入式的关系
    {
       "name": "Tom Hanks",
       "contact": "987654321",
       "dob": "01-01-1991",
       "address":
       [{
       "building": "22 A, Indiana Apt",
       "pincode": 123456,
       "city": "chengdu",
       "state": "sichuan"
       },
       {
       "building": "170 A, Acropolis Apt",
       "pincode": 456789,
       "city": "beijing",
       "state": "beijing"
       }]
    }
    
    引用
    # 这就是引用式关系
    {
       "name": "Tom Benzamin",
       "contact": "987654321",
       "dob": "01-01-1991",
       "address_ids": [
          ObjectId("52ffc4a5d85242602e000000")    #对应address文档的id字段
       ]
    }
    

    在实际应用的时候,嵌入式关系比较适合一对一的关系,引用式关系比较适合一对多或者多对多的情况。

    元数据

    数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.*。

    DBNAME 可用 db 或数据库名替代:

    DBNAME.system.namespaces :列出所有名字空间
    DBNAME.system.indexs :列出所有索引
    DBNAME.system.profile :列出数据库概要信息
    DBNAME.system.users :列出访问数据库的用户
    DBNAME.system.sources :列出服务器信息

    数据库的创建与销毁

    进入mongo操作界面

    mongo
    

    使用use进入某个数据库亦或创建数据库

    use db-name
    

    查看当前连接数据库

    db
    

    查看所有数据库

    show dbs
    

    PS:

    mongodb数据库不显示空的数据库

    所以这里并没有显示

    销毁数据库

    销毁数据库 记得先使用 use指令进入数据库先

    例如 use db-name

    db.dropDatabase()
    

    验证 查看

    show dbs
    
    销毁数据库

    集合创建和删除

    创建集合

    先进入数据库

    use 数据库名

    use mydb
    

    使用db的createCollection("集合名称") 创建集合

    db.createCollection("users")
    
    
    > db.createCollection("shiyanlou") #无参数
    { "ok" : 1 }
    > show collections
    shiyanlou
    system.indexes
    > db.createCollection("shiyanlou2", { capped : 1, autoIndexId : 1, size : 6142800, max : 10000 } ) #带参数
    { "ok ": 1 }
    
    创建集合

    显示所有集合

    show collections
    
    显示所有集合

    删除集合

    # 先显示所有的集合
    show collections
    # db.集合名称.drop()
    db.users.drop()
    # 验证结果
    show collections
    
    
    删除集合

    文档

    向集合中插入文档

    insert

    inset语句 如果你要插入多条就要用 []数组的形式

    插入一条则使用{}就可以了

    db.users.insert([ { name : "jam", email : "jam@qq.com"  },  { name : "tom", email : "tom@qq.com"} ])
    
    插入文档

    还可以这样插入文档

    > userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })
    > userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-11","hour":"06:34 AM"}] })
    > doc1=({"name":"peter","position":"teacher"})    #先定义文档
    
    > use Chenshi
    switched to db Chenshi
    > db.shiyanlou.insert(userdoc1)
    WriteResult({"nInserted":1})
    > db.shiyanlou.insert(userdoc2)
    WriteResult({"nInserted":1})
    > db.shiyanlou.insert(doc1)
    WriteResult({"nInserted":1})
    

    save

    db.users.save([ { name : "jam", email : "jam@qq.com" },{ name : "tom",  email : "tom@qq.com"} ])
    

    更新文档

    使用 db.collection_name.update({条件}, {$set:{设置的值}})

    > db.shiyanlou.update({"user_id":2,"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}})
    WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
    > db.shiyanlou.find()
    

    默认的 update 函数只对一个文档更新,如果想作用所有文档,则需要加入 multi:true

    db.shiyanlou.update({"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}},{multi:true})
    

    替换数据

    使用save

    其实save 跟insert语句差不多

    但是save更加好用

    语法:db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

    操作实例:

    > db.shiyanlou.save({"_id":ObjectId("53ea174ccb4c62646d9544f4"),"name":"Bob","position":"techer"})
    WriteResult({"nMatched":1,"nUpserted":1,"nModified":1})
    

    删除文档

    使用remove语句

    括号里头是查找条件

    语法:db.COLLECTION_NAME.remove(DELECTION_CRITERIA)

    操作实例:

    > db.shiyanlou.remove({"name":"Bob"})
    WriteResult({"nRemoved":1})
    

    查找数据

    查询语句

    数据准备

    前提是开启了mongodb的服务

    进入mongo操作

    > use school
    > db.student.insert([
    {
       name: '洪宏鸿',
       age: 25,
       sex: 1,
       pass: '825'
    },
    {
       name: '洪金宝',
       age: 50,
       sex: 1,
       pass: '123'
    },
    {
       name: '洪小玲',
       age: 40,
       sex: 0,
       pass: '369'
    }
    ])
    

    查询find

    格式为 db.集合名称.find()

    find 不加任何参数返回所有的记录

    db.student.find()
    

    加上pretty()方法可以让你的输出美化


    美化

    如果你想让 mongo shell 始终以 pretty 的方式显示返回数据,可以通过下面的指令实现

    echo "DBQuery.prototype._prettyShell = true" >> ~/.mongorc.js
    

    当我退出mongo命令之后

    之前打的数据就没了 坑呀。。。只好重新插入数据

    重插数据

    好在结果没让我失望


    重插结果
    and

    find 操作默认的动作就是and

    如果你直接把条件加到bson格式的对象中

    那就是用and去查找数据

    例如

    db.student.find({"name": "hong", "pass": "825"})
    
    and条件

    相当于

    关系性数据库中

    select * from student where name='hong' and pass = '825'
    
    or

    or操作使用 $or 操作符

    查找格式如下:

    db.student.find(
    {
        $or : [
            {"name" : "hong"},
            {"pass" : "825"}
        ]
    }
    )
    

    相当于

    select * from student where name='hong' or pass = '825'
    
    or条件
    and 结合 or
    db.student.find(
    {
        "age": {$gt:21}
        $or : [
            {"name" : "hong"},
            {"pass" : "825"}
        ]
    }
    )
    

    {$gt:10} 表示大于 10,另外,$lt 表示小于、$gte 表示大于等于、$lte 表示小于等于、$ne 表示不等于。

    如果这样的符号记起来稍微有点麻烦,可以根据它们的全写配合记忆:

    • gt:大于 greater than

    • lt:小于 less than

    • gte:大于或等于 greater than equal

    • lte:小于或等于 less than equal

      and or 结合
    正则

    使用 // 形式进行匹配


    正则

    相关文章

      网友评论

          本文标题:【MongoDB】入门-实验楼篇

          本文链接:https://www.haomeiwen.com/subject/mfwivltx.html