mongodb简单介绍

mongodb 是什么

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

主要特点

MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
MongoDB安装简单。

Windows 平台安装 MongoDB

见链接 安装mongodb

Mongdb中的一些概念

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

操作

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.qpx</groupId>
    <artifactId>upms-producer-mongodb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>upms-producer-mongodb</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.qpx</groupId>
            <artifactId>common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

注入 mongoTemplate

@Autowired
MongoTemplate mongoTemplate;

增加操作(插入)
   可以一次性插入一个 对象集合 ,也可以单次插入 一个对象 ;需要插入的数据量大的时候,建议使用批量插入

	List<SysUser> userList = new ArrayList<>();
	
	userList.add(new SysUser(11,"1","白小飞","18888888888"));
	userList.add(new SysUser(9,"1","白敬亭","13333333333"));
	userList.add(new SysUser(5,"1","林宥嘉","14444444444"));
	userList.add(new SysUser(6,"1","彭于晏","15555555555"));
	userList.add(new SysUser(7,"1","周杰伦","16666666666"));
	
	mongoTemplate.insert(userList, "userList");	// 第一个参数是要插入的数据(文档),第二个参数是集合名称;批量插入


	SysUser sysUser = new SysUser(12,"1","黄小飞","18888888888");
	mongoTemplate.insert(sysUser, "userList");	// 第一个参数是要插入的数据(文档),第二个参数是要插入的mongo集合名
或者
	SysUser sysUser = new SysUser(12,"1","黄小飞","18888888888");
	mongoTemplate.save(sysUser);	// 参数表示要保存的数据(文档);save()方法只能用于单个对象保存,不可用于批量插

注意: 同一个mongo集合中,前后插入的数据 对象类型要一致
    实体类需要用注解标识:
      @Document(collection = “xxx”):用于实体类上,表明这是一个MongoDB的文档集合,相当于MySQL的数据表;其中collection表示集合名称,不写则默认为实体类名称
      @Id:用于实体类中的成员变量,表示主键标识
      @Field(“xxx”):用于实体类中的成员变量,表示MongoDB文档集合中的字段,其值对应集合的字段名称

删除操作

// 删除author为yinjihuan的数据
	Query query = Query.query(Criteria.where("author").is("yinjihuan"));
	mongoTemplate.remove(query, Article.class);
 	// 也可直接指定MongoDB集合名称
	query = Query.query(Criteria.where("author").is("yinjihuan"));
	mongoTemplate.remove(query, "article_info");
 	// 删除集合,可传实体类,也可以传名称
	mongoTemplate.dropCollection(Article.class);
	mongoTemplate.dropCollection("article_info");
 	// 删除数据库;在开发中,开发所使用的数据库是在配置文件中配置的;使用这个方法即可直接删除配置对应的数据库
	mongoTemplate.getDb().dropDatabase();

下面这2种 适合 知道要删除几条数据的场景

//查询出符合条件的第一个结果,并将符合条件的数据删除,只会删除第一条
	query = Query.query(Criteria.where("author").is("yinjihuan"));
	Article article = mongoTemplate.findAndRemove(query, Article.class);
 //查询出符合条件的所有结果,并将符合条件的所有数据删除
	query = Query.query(Criteria.where("author").is("yinjihuan"));
	List<Article> articles = mongoTemplate.findAllAndRemove(query, Article.class);
 

修改操作
   准备要练习的数据2条,如下:

{
    "_id": ObjectId("57c43caed4c63d7e39b5dc48"),
    "title": "MongoTemplate的基本使用",
    "url": "http://cxytiandi.com/blog/detail/0",
    "author": "yinjihuan",
    "tags": [
        "java",
        "mongodb",
        "spring"
    ],
    "visit_count": 0,
    "add_time": ISODate("2016-08-29T13:46:21.881Z")
}
{
    "_id": ObjectId("57c43caed4c63d7e39b5dc49"),
    "title": "MongoTemplate的基本使用",
    "url": "http://cxytiandi.com/blog/detail/1",
    "author": "yinjihuan",
    "tags": [
        "java",
        "mongodb",
        "spring"
    ],
    "visit_count": 0,
    "add_time": ISODate("2016-08-29T13:46:22.201Z")
}

修改第一条author为yinjihuan的数据中的title和visitCount

Query query = Query.query(Criteria.where("author").is("yinjihuan"));
Update update = Update.update("title", "MongoTemplate").set("visitCount", 10);
mongoTemplate.updateFirst(query, update, Article.class);

修改后结果如下,我们会发现第一条数据的title还有visit_count被修改了

{
    "_id": ObjectId("57c43caed4c63d7e39b5dc48"),
    "title": "MongoTemplate",
    "url": "http://cxytiandi.com/blog/detail/0",
    "author": "yinjihuan",
    "tags": [
        "java",
        "mongodb",
        "spring"
    ],
    "visit_count": 10,
    "add_time": ISODate("2016-08-29T13:46:21.881Z")
}
{
    "_id": ObjectId("57c43caed4c63d7e39b5dc49"),
    "title": "MongoTemplate的基本使用",
    "url": "http://cxytiandi.com/blog/detail/1",
    "author": "yinjihuan",
    "tags": [
        "java",
        "mongodb",
        "spring"
    ],
    "visit_count": 0,
    "add_time": ISODate("2016-08-29T13:46:22.201Z")
}

修改全部符合条件的

query = Query.query(Criteria.where("author").is("yinjihuan"));
update = Update.update("title", "MongoTemplate").set("visitCount", 10);
mongoTemplate.updateMulti(query, update, Article.class);

修改后结果如下,我们会发现所有数据的title还有visit_count被修改了

{
	    "_id": ObjectId("57c43caed4c63d7e39b5dc48"),
	    "title": "MongoTemplate",
	    "url": "http://cxytiandi.com/blog/detail/0",
	    "author": "yinjihuan",
	    "tags": [
	        "java",
	        "mongodb",
	        "spring"
	    ],
	    "visit_count": 10,
	    "add_time": ISODate("2016-08-29T13:46:21.881Z")
	}
	{
	    "_id": ObjectId("57c43caed4c63d7e39b5dc49"),
	    "title": "MongoTemplate",
	    "url": "http://cxytiandi.com/blog/detail/1",
	    "author": "yinjihuan",
	    "tags": [
	        "java",
	        "mongodb",
	        "spring"
	    ],
	    "visit_count": 10,
	    "add_time": ISODate("2016-08-29T13:46:22.201Z")
	}

特殊更新,更新author为jason的数据,如果没有author为jason的数据则以此条件创建一条新的数据
   当没有符合条件的文档,就以这个条件和更新文档为基础创建一个新的文档,如果找到匹配的文档就正常的更新。

query = Query.query(Criteria.where("author").is("jason"));
	update = Update.update("title", "MongoTemplate").set("visitCount", 10);
	mongoTemplate.upsert(query, update, Article.class);

// 修改后结果如下,我们会发现新增了一条数据
	{
	    "_id": ObjectId("57c43caed4c63d7e39b5dc48"),
	    "title": "MongoTemplate",
	    "url": "http://cxytiandi.com/blog/detail/0",
	    "author": "yinjihuan",
	    "tags": [
	        "java",
	        "mongodb",
	        "spring"
	    ],
	    "visit_count": 10,
	    "add_time": ISODate("2016-08-29T13:46:21.881Z")
	}
	{
	    "_id": ObjectId("57c43caed4c63d7e39b5dc49"),
	    "title": "MongoTemplate",
	    "url": "http://cxytiandi.com/blog/detail/1",
	    "author": "yinjihuan",
	    "tags": [
	        "java",
	        "mongodb",
	        "spring"
	    ],
	    "visit_count": 10,
	    "add_time": ISODate("2016-08-29T13:46:22.201Z")
	}
	{
	    "_id": ObjectId("57c6e1601e4735b2c306cdb7"),
	    "author": "jason",
	    "title": "MongoTemplate",
	    "visit_count": 10
	}

更新条件不变,更新字段改成了一个我们集合中不存在的,用set方法如果更新的key不存在则创建一个新的key

query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").set("money", 100);
mongoTemplate.updateMulti(query, update, Article.class);

// 修改后结果如下,我们会发现新加了一个key
	{
	    "_id": ObjectId("57c6e1601e4735b2c306cdb7"),
	    "author": "jason",
	    "title": "MongoTemplate",
	    "visit_count": 10,
	    "money":100
	}

update的inc方法用于做累加操作,将money在之前的基础上加上100

query = Query.query(Criteria.where("author").is("jason"));
	update = Update.update("title", "MongoTemplate").inc("money", 100);
	mongoTemplate.updateMulti(query, update, Article.class);


// 修改后结果如下,我们会发现money变成200
	{
	    "_id": ObjectId("57c6e1601e4735b2c306cdb7"),
	    "author": "jason",
	    "title": "MongoTemplate",
	    "visit_count": 10,
	    "money":200
	}

update的rename方法用于修改key的名称

query = Query.query(Criteria.where("author").is("jason"));
	update = Update.update("title", "MongoTemplate").rename("visitCount", "vc");
	mongoTemplate.updateMulti(query, update, Article.class);

// 修改结果如下,可以发现字段visitCount被修改成为了vc
	{
	    "_id": ObjectId("57c6e1601e4735b2c306cdb7"),
	    "author": "jason",
	    "title": "MongoTemplate",
	    "vc": 10,
	    "money":200
	}

   update的unset方法用于删除key
query = Query.query(Criteria.where("author").is("jason"));
update = Update.update("title", "MongoTemplate").unset("vc");
mongoTemplate.updateMulti(query, update, Article.class);

// 修改后结果如下,我们会发现vc这个key被删除了
	{
	    "_id": ObjectId("57c6e1601e4735b2c306cdb7"),
	    "author": "jason",
	    "title": "MongoTemplate",
	    "money":200
	}

update的pull方法用于删除tags数组中的java

query = Query.query(Criteria.where("author").is("yinjihuan"));
update = Update.update("title", "MongoTemplate").pull("tags", "java");
mongoTemplate.updateMulti(query, update, Article.class);

// 修改后结果如下,我们会发现tags里的java被删除了
	{
	    "_id": ObjectId("57c43caed4c63d7e39b5dc48"),
	    "title": "MongoTemplate",
	    "url": "http://cxytiandi.com/blog/detail/0",
	    "author": "yinjihuan",
	    "tags": [
	        "mongodb",
	        "spring"
	    ],
	    "visit_count": 10,
	    "add_time": ISODate("2016-08-29T13:46:21.881Z")
	}
	{
	    "_id": ObjectId("57c43caed4c63d7e39b5dc49"),
	    "title": "MongoTemplate",
	    "url": "http://cxytiandi.com/blog/detail/1",
	    "author": "yinjihuan",
	    "tags": [
	        "mongodb",
	        "spring"
	    ],
	    "visit_count": 10,
	    "add_time": ISODate("2016-08-29T13:46:22.201Z")
	}

查询操作
MongoDB的查询方式很多种,下面只列了一些常用的,比如:
     1、=查询
     2、模糊查询
     3、大于小于范围查询
     4、in查询
     5、or查询
     6、查询一条,查询全部
  根据作者查询所有符合条件的数据,返回List

Query query = Query.query(Criteria.where("author").is("yinjihuan"));
List<Article> articles = mongoTemplate.find(query, Article.class);

只查询符合条件的第一条数据,返回Article对象

query = Query.query(Criteria.where("author").is("yinjihuan"));
Article article = mongoTemplate.findOne(query, Article.class);

查询集合中所有数据,不加条件

articles = mongoTemplate.findAll(Article.class);

查询符合条件的数量

query = Query.query(Criteria.where("author").is("yinjihuan"));
	long count = mongoTemplate.count(query, Article.class);

根据主键ID查询

article = mongoTemplate.findById(new ObjectId("57c6e1601e4735b2c306cdb7"), Article.class);

in查询

List<String> authors = Arrays.asList("yinjihuan", "jason");
query = Query.query(Criteria.where("author").in(authors));
articles = mongoTemplate.find(query, Article.class);

ne(!=)查询

query = Query.query(Criteria.where("author").ne("yinjihuan"));
	articles = mongoTemplate.find(query, Article.class);

lt(<)查询访问量小于10的文章

query = Query.query(Criteria.where("visitCount").lt(10));
	articles = mongoTemplate.find(query, Article.class);

范围查询,大于5小于10

query = Query.query(Criteria.where("visitCount").gt(5).lt(10));
	articles = mongoTemplate.find(query, Article.class);

模糊查询,author中包含a的数据

query = Query.query(Criteria.where("author").regex("a"));
	articles = mongoTemplate.find(query, Article.class);

数组查询,查询tags里数量为3的数据

query = Query.query(Criteria.where("tags").size(3));
	articles = mongoTemplate.find(query, Article.class);

or查询,查询author=jason的或者visitCount=0的数据

query = Query.query(Criteria.where("").orOperator(
	    Criteria.where("author").is("jason"),
	    Criteria.where("visitCount").is(0)));
	articles = mongoTemplate.find(query, Article.class);

你可能感兴趣的:(mongodb简单介绍)