NoSQL之MongoDB

MongoDB简介

  • MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展。MongoDB是工作在集合和文档上一种概念

  • MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案

  • MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

MongoDB特点

  • 面向集合存储,易于存储对象类型的数据

  • 模式自由

  • 支持动态查询

  • 支持完全索引,包含内部对象

  • 支持查询

  • 支持复制和故障恢复

  • 使用高效的二进制数据存储,包括大型对象(如视频等)

  • 自动处理碎片,以支持云计算层次的扩展性

  • 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序

  • 文件存储格式为 BSON(一种 JSON 的扩展),文档型

  • 可通过网络访问

面向集合(Collenction-Orented)

  • 意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)

模式自由(schema-free)

  • 意味着对于存储在 MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。提了这么多次"无模式"或"模式自由",它到是个什么概念呢? 例如,下面两个记录可以存在于同一个集合里面:

    {"welcome" : "Beijing"}

    {"age" : 25}

文档型:

  • 意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档. 我们把这个数据格式称作 “BSON” 即 “Binary Serialized dOcument Notation.”

MongoDB应用场景

适合场景:

1.网站数据,实时的插入,更新与查询。
2.由于性能很高,可做持久化缓存层。
3.存储大尺寸,低价值的数据。
4.高伸缩性的集群场景。
5.BSON格式非常适合文档化数据的存储及查询。

不适合场景:

1.高度事务性的系统,例如银行或会计系统。
2.传统的商业智能应用,针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

MongoDB下载安装(Linux)

教程系统版本:(Linux版本下CentOS Linux release 7.3.1611 (Core))

下载:

1:在线下载
  wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.9.tgz
2:官网下载
  https://www.mongodb.com/download-center?ct=atlasheader#atlas

安装(在线安装):

1:进入/opt目录下

cd    /opt


2:创建文件夹

mkdir    mongodb


3:进入mongodb目录下,在线下载mongodb资源安装包

cd      mongodb/
wget     https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.9.tgz


4:解压mongodb资源包到当前路径下

tar     -zcxf      mongodb-linux-x86_64-3.2.9.tgz


5:进入目录/usr/local/下,并创建文件夹mongodb

cd         /usr/local
mkdir    mongodb


6:将mongodb-linux-x86_64-3.2.9文件夹内的内容 移动到 /usr/local/mongodb下

mv        /opt/mongodb/mongodb-linux-x86_64-3.2.9/* /usr/local/mongodb


7:在mongodb目录下,新建1个文件夹和1个文件

mkdir      data

touch      logs


8:在系统执行文件~/.bash_profile中添加mongodb的执行命令

vim ~/.bash_profile
内容为:
  PATH=$PATH:$HOME/bin:/usr/local/mongodb/bin

source ~/.bash_profie


Mongodb启动方式

mongodb有三种启动方式:

启动1:进入/bin目录下,输入mongod          --dbpath=/usr/local/mongodb/data          --fork           --logpath=/usr/local/mongodb/logs 

  启动之后,输入mongo就可以进入mongodb客户端连接
  然后输入show dbs;如果显示数据库,则启动搭建成功


启动2:配置启动文件启动mongodb.conf(推荐)

  mongodb.conf内容:

  logpath=/usr/local/mongodb/logs
  logappend = true 
  #fork and run in background
  fork = true
  #port = 27017
  dbpath=/usr/local/mongodb/data
  #location of pidfile
  pidfilepath=/usr/local/mongodb/mongod.pid 

之前打开数据库了,所以先关库:
可以使用db.shutdownServer()命令,或者ps -ef|grep mongod查看进程号,使用kill -9 进程号即可





启动3:配置service服务启动(推荐)

MongoDB基本操作

  • 体系结构

MongoDB 是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台 特性。在不同的操作系统上虽然略有差别,但是从整体构架上来看,MongoDB 在不同的平 台上是一样的,如数据逻辑结构和数据的存储等等。

一个运行着的 MongoDB 数据库就可以看成是一个 MongoDB Server,该 Server 由实例和数据库组成,在一般的情况下一个 MongoDB Server 机器上包含一个实例和多个与之对应的数据库,但是在特殊情况下,如硬件投入成本有限或特殊的应用需求,也允许一个 Server 机器上可以有多个实例和多个数据库。

MongoDB 中一系列物理文件(数据文件,日志文件等)的集合或与之对应的逻辑结构(集 合,文档等)被称为数据库,简单的说,就是数据库是由一系列与磁盘有关系的物理文件的 组成。

- 数据逻辑结构
   MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
    1: MongoDB 的文档(document),相当于关系数据库中的一行记录
    2:多个文档组成一个集合(collection),相当于关系数据库的表
    3:多个集合(collection),逻辑上组织在一起,就是数据库(database)

    4:一个 MongoDB 实例支持多个数据库(database)


- 数据存储结构
  MongoDB 的默认数据目录是/data/db,它负责存储所有的 MongoDB 的数据文件。在 MongoDB内部,每个数据库都包含一个.ns 文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多


对比:


  • 启动、停止数据库

        参考上面操作命令


  • 连接数据库

参考上面操作命令

mongod参数说明

dbpath:
          数据文件存放路径,每个数据库会在其中创建一个子目录,用于防止同一个实例多次运行的 mongod.lock 也保存在此目录中。
logpath
          错误日志文件
logappend
          错误日志采用追加模式(默认是覆写模式)
bind_ip
           对外服务的绑定 ip,一般设置为空,及绑定在本机所有可用 ip 上,如有需要可以单独指定
port
           对外服务端口。Web 管理端口在这个 port 的基础上+1000 
fork
            以后台 Daemon 形式运行服务
journal
             开启日志功能,通过保存操作日志来降低单机故障的恢复时间,在 1.8 版本后正式加入,取代在 1.7.5 版本中的 dur 参数。
syncdelay
            系统同步刷新磁盘的时间,单位为秒,默认是 60 秒。
directoryperdb
          每个 db 存放在单独的目录中,建议设置该参数。与 MySQL 的独立表空间类似maxConns最大连接数
repairpath
           执行 repair 时的临时目录。在如果没有开启 journal,异常 down 机后重启,必须执行 repair操作

常见命令

show dbs:显示数据库列表 
show collections:显示当前数据库中的集合(类似关系数据库中的表) 
show users:显示用户
use <db name>:切换当前数据库,这和MS-SQL里面的意思一样 
db.help():显示数据库操作命令,里面有很多的命令 
db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令 
db.foo.find():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据) 
db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1
MongoDB没有创建数据库的命令,但有类似的命令。
修复当前数据库  db.repairDatabase();
查看当前使用的数据库 
  db.getName();
   db; db和getName方法是一样的效果,都可以查询当前使用的数据库
显示当前db状态 db.stats();
当前db版本 db.version();
查看当前db的链接机器地址 db.getMongo();

基本操作

  • 添加文档:

db.users.insert({ 
  “_id”:ObjectId("52c3c518498a9646a48133a2"),
  “name”:“likang”, 
  “email”:“likang@qq.com”
}); 
db.users.save({ 
  “_id”:ObjectId("52c3c518498a9646a48133a2"),
  “name”:“likang2”, 
  “email”:“likang2@qq.com”
}); 

insert 当_id存在时报错
save 当_id存在时覆盖更新

  • 删除文档:

//删除全部
db.user.remove(); 
//删除指定记录
db.user.remove({“name”:“likang”}); 

//删除user集合
db.user.drop();

  • 更新文档:

 原文档:
  { 
    “_id”:ObjectId("52c3c518498a9646a48133a2"),
    “name”:“likang”, 
    “email”:“likang@qq.com”
  } 
  !
  修改后的文档:
  { 
    “_id”:ObjectId("52c3c518498a9646a48133a2"),
    “name”:“likang”, 
    “email”:[
      “likang@qq.com”, 
      “likang2@qq.com” 
    ] 
  }

  var doc = db.users.findOne({"name" : “likang”});
  doc.email =[ 
    “likang@qq.com”, 
    “likang2@qq.com” 
  ]; 
  db.users.update({ "name" : "likang" }, doc);

  // 更新:指定第三个参数为true可以开启upsert模式
  //根据条件查找不到数据则创建⼀条新的
  db.users.update({ "name" : "likang" }, doc, true);
  • 查询文档:


常用工具集

MongoDB 在 bin 目录下提供了一系列有用的工具,这些工具提供了 MongoDB 在运维管理上的方便。

  • bsondump: 将 bson 格式的文件转储为 json 格式的数据

  • mongo: 客户端命令行工具,其实也是一个 js 解释器,支持 js 语法

  • mongod: 数据库服务端,每个实例启动一个进程,可以 fork 为后台运行

  • mongodump/ mongorestore: 数据库备份和恢复工具

  • mongoexport/ mongoimport: 数据导出和导入工具

  • mongofiles: GridFS 管理工具,可实现二制文件的存取 -mongos: 分片路由,如果使用了 sharding 功能,则应用程序连接的是 mongos 而不是 mongod

  • mongosniff: 这一工具的作用类似于 tcpdump,不同的是他只监控 MongoDB 相关的包请求,并且是以指定的可读性的形式输出

  • mongostat: 实时性能监控工具

Java操作MongoDB示例

  • 新建maven project工程


  • 配置所需jar包

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.3.0</version>
</dependency>

  • 增加连接mongodb的工具类

/**
 * mongodb工具类
 * @author likang
 * @date  2017-4-23 下午8:19:53
 */
public class MongoDbUtil {

  private static MongoCollection<Document> collection;

  /**
   * 链接数据库
   * 
   * @param databaseName 数据库名称
   * @param collectionName 集合名称
   * @param hostName 主机名
   * @param port 端口号
   */

  public static void connect(String databaseName, String collectionName,

String hostName, int port) {

    @SuppressWarnings("resource")
    MongoClient client = new MongoClient(hostName, port);
    MongoDatabase db = client.getDatabase(databaseName);
    collection = db.getCollection(collectionName);
    System.out.println(collection);
  }

  /**
   * 插入一个文档
   * 
   * @param document 文档
   */
  public static void insert(Document document) {
    collection.insertOne(document);
  }

  /**
   * 查询所有文档
   * 
   * @return 所有文档集合
   */
  public static List<Document> findAll() {
    List<Document> results = new ArrayList<Document>();
    FindIterable<Document> iterables = collection.find();
    MongoCursor<Document> cursor = iterables.iterator();
    while (cursor.hasNext()) {
      results.add(cursor.next());
    }
    return results;
  }

  /**
   * 根据条件查询
   * 
   * @param filter
   *      查询条件 //注意Bson的几个实现类,BasicDBObject, BsonDocument,
   *      BsonDocumentWrapper, CommandResult, Document, RawBsonDocument
   * @return 返回集合列表
   */
  public static List<Document> findBy(Bson filter) {
    List<Document> results = new ArrayList<Document>();
    FindIterable<Document> iterables = collection.find(filter);
    MongoCursor<Document> cursor = iterables.iterator();
    while (cursor.hasNext()) {
      results.add(cursor.next());
    }
    return results;
  }

  /**
   * 更新查询到的第一个
   * @param filter 查询条件
   * @param update 更新文档
   * @return 更新结果
   */
  public static UpdateResult updateOne(Bson filter, Bson update) {
    UpdateResult result = collection.updateOne(filter, update);
    return result;
  }

  /**
   * 更新查询到的所有的文档
   * 
   * @param filter 查询条件
   * @param update 更新文档
   * @return 更新结果
   */
  public static UpdateResult updateMany(Bson filter, Bson update) {
    UpdateResult result = collection.updateMany(filter, update);
    return result;
  }

  /**
   * 更新一个文档, 结果是replacement是新文档,老文档完全被替换
   * 
   * @param filter 查询条件
   * @param replacement 跟新文档
   */
  public static void replace(Bson filter, Document replacement) {
    collection.replaceOne(filter, replacement);
  }

  /**
   * 根据条件删除一个文档
   * @param filter 查询条件
   */
  public static void deleteOne(Bson filter) {
    collection.deleteOne(filter);
  }

  /**
   * 根据条件删除多个文档
   * @param filter 查询条件
   */
  public static void deleteMany(Bson filter) {
    collection.deleteMany(filter);
  }
}

  • 编写mongodb操作测试类

public class MongoTest {

  public static void main(String[] args) {
    MongoDbUtil.connect("test", "jihe1", "*.*.*.*", 27017);
//   testInsert();
//   testFindAll();
//   Mongo mg = new Mongo("39.106.131.203",27017);
//    DB db = mg.getDB("jihe1");
//    for(String s:db.getCollectionNames()){
//     System.out.println("内容如下:");
//      System.out.println(s);
//    }
//   
  }

  public static void testInsert() {
    Document document = new Document();
    document.append("name", "likang").append("phone", "18912341234");
    MongoDbUtil.insert(document);
  }

  public static void testFindAll() {
    List<Document> results = MongoDbUtil.findAll();
    for (Document doc : results) {
      System.out.println(doc.toJson());
    }
  }

  public static void testFindBy() {
    Document filter = new Document();
    filter.append("name", "li si");
    List<Document> results = MongoDbUtil.findBy(filter);
    for (Document doc : results) {
      System.out.println(doc.toJson());
    }
  }

  public static void testUpdateOne() {
    Document filter = new Document();
    filter.append("phone", "18912341235");
    // 注意update文档里要包含"$set"字段
    Document update = new Document();
    update.append("$set", new Document("phone", "123123123"));
    UpdateResult result = MongoDbUtil.updateOne(filter, update);
    System.out.println("matched count = " + result.getMatchedCount());
  }

  public static void testUpdateMany() {
    Document filter = new Document();
    filter.append("phone", "18912341235");
    // 注意update文档里要包含"$set"字段
    Document update = new Document();
    update.append("$set", new Document("phone", "123123123"));
    UpdateResult result = MongoDbUtil.updateMany(filter, update);
    System.out.println("matched count = " + result.getMatchedCount());
  }

  public static void testReplace() {
    Document filter = new Document();
    filter.append("name", "likang");
    // 注意:更新文档时,不需要使用"$set"
    Document replacement = new Document();
    replacement.append("value", 123);
    MongoDbUtil.replace(filter, replacement);
  }

  public static void testDeleteOne() {
    Document filter = new Document();
    filter.append("name", "wang");
    MongoDbUtil.deleteOne(filter);
  }

  public static void testDeleteMany() {
    Document filter = new Document();
    filter.append("phone", "18778907890");
    MongoDbUtil.deleteMany(filter);
  }
}

MongoDB总结

  • Mongodb主要解决的是海量数据的访问效率问题,根据官方的文档,当数据量达到50GB以上的时候,Mongo的数据库访问速度是MySQL的10倍以上。Mongo的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万-1.5次读写请求。因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储,最后由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能和类似于sql的索引。

  • Mongodb的高性能在于模式自由,使用高效的二进制数据存储,包括大型对象(如视频等)自动处理碎片,以支持云计算层次的扩展性。在存储海量数据的同时,还有良好的查询性能。当然了mongodb支持多种语言,支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵叻嗰咪

如果有用,请作者喝杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值