MongoDB 简介

  1. 适用场景
    • 吐槽和评论数据特点分析
      • 数据量较大
      • 写入操作频繁
      • 价值较低
    • 线上运行的系统产生大量的日志、警告信息、用户操作信息通常以文本的方式保存。
      • 使用MongoDB后可读性强、可以挖掘出具有价值的日志。
  2. 简介
    • MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种。
    • 它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。
    • 它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
  3. 特点
    • 面向集合存储,易于存储对象类型的数据。
    • 模式自由
    • 支持动态查询
    • 支持完全索引,包含内部对象
    • 支持复制和故障恢复
    • 使用高效的二进制数据存储,包括大型对象(如视频等)
    • 自动处理碎片,以支持云计算层次的扩展性
    • 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序
    • 文件存储格式为 BSON(一种 JSON 的扩展)
  4. 体系结果
    • Document ----》collection ----》database
      • MongoDB中的文档(Document) 相当于关系型数据库中的一行数据
      • 多个Document 组成一个集合,相当于关系型数据库中的表
      • 多个 collection 可组合成为一个数据库

    MongoDB体系结构

  5. 对比MySQL
MongoDB MySQL
数据库(database) 数据库(database)
集合(collection) 表(table)
文档(document) 行(row)
  1. 数据类型
    • 基本数据类型null:用于表示空值或者不存在的字段,{“x”:null}
    • 布尔型:布尔类型有两个值true和false,{“x”:true}
    • 数值:shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
    • 字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}
    • 日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}
    • 正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”????[abc]/}
    • 数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]}
    • 内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}
    • 对象Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() }
    • 二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非utf-字符保存到数据库中,二进制数据是唯一的方式。
    • 代码:查询和文档中可以包括任何JavaScript代码,{“x”:function(){/.../}}

MongoDB使用

  1. 安装:mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi
    • 配置环境变量
  2. 首先打开命令提示符,创建一个用于存放数据的目录
    • mkdir F:\Program Files\MongoDB\data
  3. 启动服务
    • mongod --dbpath=F:\CodeSheep\MongoDBData
      • 会使用占用模式启动
  4. 终端输入:mongo
  5. 常用命令【插入与查询文档】
    • 创建并连接:use spitdb

      switched to db spitdb

    • 插入语法
      • db.集合名称.insert(数据);
    • 查询语法
      • db.集合名称.find();
    • 插入一条数据
      • db.spitdb.insert({content:"听说十次方课程很给力呀!",userid:"1011",nickname:"小雅",visits:NumberInt(902)})

      WriteResult({ "nInserted" : 1 })

    • 查询集合中所有的文档
      • db.spitdb.find();

      { "_id" : ObjectId("5f491cee35ade36afe44f706"), "content" : "听说十次方课程很给力呀!", "userid" : "1011", "nickname" : "小雅", "visits" : 902 }
      { "_id" : ObjectId("5f491dcc35ade36afe44f707"), "content" : "听说十次方课程很给力呀!", "userid" : "1012", "nickname" : "预瑶瑶", "visits" : 901 }

    • 自定义主键编号
      • db.spit.insert({_id:"1",content:"我还是没有想明白到底为啥出错",userid:"1012",nickname:"小明",visits:NumberInt(2020)});
      • db.spit.insert({_id:"2",content:"加班到半夜",userid:"1013",nickname:"凯撒",visits:NumberInt(1023)});
      • db.spit.insert({_id:"3",content:"手机流量超了咋办?",userid:"1013",nickname:"凯撒",visits:NumberInt(111)});
      • db.spit.insert({_id:"4",content:"坚持就是胜利",userid:"1014",nickname:"诺诺",visits:NumberInt(1223)});
    • 如果我想按一定条件来查询,比如我想查询userid为1011的记录
      • db.spit.find({userid:'1013'})
    • 如果你只需要返回符合条件的第一条数据,我们可以使用findOne命令来实现
      • db.spit.findOne({userid:'1013'})
    • 如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果,例如
      • db.spit.find().limit(3)
  6. 常用命令【修改与删除文档】
    • 修改语法
      • db.集合名称.update(条件,修改后的数据)
    • 删除语法
      • db.集合名称.remove(条件)
    • 如果我们想修改_id为1的记录,浏览量为1000,输入以下语句:
      • db.spit.update({_id:"1"},{visits:NumberInt(1000)})

      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

    • 执行后,我们会发现,这条文档除了visits字段其它字段都不见了,为了解决这个问题,我们需要使用修改器$set来实现,命令如下:
      • db.spit.update({_id:"2"},{$set:{visits:NumberInt(2000)}})
    • 以下语句可以将数据全部删除,请慎用
      • db.spit.remove({})
    • 如果删除visits=1000的记录,输入以下语句
      • db.spit.remove({visits:1000})
  7. 常用命令【统计条数】
    • 统计集合中的数据总和
      • db.spit.count()
    • 如果按条件统计,例如:统计userid为1013的记录条数
      • db.spit.count({userid:"1013"})
  8. 常用命令【模糊查询】
    • MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:/模糊查询字符串/
    • 例如,我要查询吐槽内容包含“流量”的所有文档,代码如下:
      • db.spit.find({content:/流量/})
    • 如果要查询吐槽内容中以“加班”开头的,代码如下:
      • db.spit.find({content:/^加班/})
  9. 常用命令【大于、小于、不等于】
    • db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
    • db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
    • db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
    • db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
    • db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
    • 示例:查询吐槽浏览量大于1000的记录
      • db.spit.find({visits:{$gt:1000}})
  10. 常用命令【包含 和 不包含】
    • 包含使用$in操作符。
    • 示例:查询吐槽集合中userid字段包含1013和1014的文档
      • db.spit.find({userid:{$in:["1013","1014"]}})
    • 不包含使用$nin操作符。
    • 示例:查询吐槽集合中userid字段不包含1013和1014的文档
      • db.spit.find({userid:{$nin:["1013","1014"]}})
  11. 常用命令【条件连接】
    • 我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相当于SQL的and)
    • 并且语法
      • $and:[ { },{ },{ } ]
    • 或者语法
      • $or:[ { },{ },{ } ]
    • 示例:查询吐槽集合中visits大于等于1000 并且小于2000的文档
      • db.spit.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]})
    • 如果两个以上条件之间是或者的关系,我们使用操作符进行关联,与前面and的使用方式相同
    • 查询吐槽集合中userid为1013,或者浏览量小于2000的文档记录
      • db.spit.find({$or:[ {userid:"1013"} ,{visits:{$lt:2000} }]})
  12. 列支增长
    • 如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用$inc运算符来实现
      • db.spit.update({_id:"2"},{$inc:{visits:NumberInt(1)}})