Contents
  1. 1. 示例源码
  2. 2. 特点
    1. 2.1. 特点描述
  3. 3. 单片集群功能
  4. 4. 适用场景
  5. 5. 有待学习的
  6. 6. 安装和初步使用
    1. 6.1. 启动
  7. 7. 基本指令
  8. 8. 全文检索命令
  9. 9. demo
  10. 10. 实战1(整合spring注解)
  11. 11. 实战 位置查询

示例源码

Spring集成MongoDB,演示CRUD和地理位置查询功能
https://github.com/huangzhenshi/mongodb_Spring_Maven

特点

官方介绍:
https://docs.spring.io/spring-data/data-mongo/docs/1.5.2.RELEASE/reference/html/mongo.core.html

https://zhuanlan.zhihu.com/p/24377636
https://yq.aliyun.com/articles/64352?spm=5176.8091938.0.0.oAHbxp
索引博客非常详细:
https://www.jianshu.com/p/53c974273218?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

特点描述

  • MongoDB是为大数据而生的
  • 大文本的存储和快速检索的功能,GB PB级别,这个是mysql无法比拟的
  • MongoDB的复制集是数据库领域领先的高可用和读写负载均衡解决方案

  • 介于Nosql和Mysql之间,支持索引、联合索引、复杂查询、排序,基本上除了join和事务类型的操作外,mongodb支持所有mysql支持的查询

  • 支持不确定的value结构,mysql需要指定字段的类型,而MongoDB不需要指定结构,甚至连内容都不要指定可以是基本类型可以是实体类甚至可以是list数组,从而间接的实现关系型数据的查找

  • MongoDB还提供了执行计划功能

  • 支持非常丰富的地理位置索引,mysql没有这个函数哎。既支持经纬度 $near函数,还有$geoWithin 在矩形或者圆形或者自定义形状内的数据,还支持$maxDistance $minDistance 完美,基本都可以覆盖地理位置相关的检索功能了
    https://www.jianshu.com/p/53c974273218?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

  • 基于文档存储(JSON结构的文档)

  • 丰富的索引功能:大文本全文检索(平民版不支持中文全文检索,企业版支持)、位置索引、TTL过期作废索引、其他常规索引:唯一性索引、联合索引

单片集群功能

介绍和演示windows下单片集群的配置
http://blog.csdn.net/yyywyr/article/details/27238411

适用场景

https://www.zhihu.com/question/32071167?sort=created

  • 应用不需要事务及复杂 join 支持必须 Yes
  • 新应用,需求会变,数据模型无法确定,想快速迭代开发?
  • 应用需要2000-3000以上的读写QPS(更高也可以)?
  • 应用需要TB甚至 PB 级别数据存储?
  • 应用发展迅速,需要能快速水平扩展?
  • 应用要求存储的数据不丢失?
  • 应用需要99.999%高可用?
  • 应用需要大量的地理位置查询、文本查询?

比如快递信息的更新、大日志的存储、

有待学习的

  • schema-less,存储结构不确定的数据,比如user数据,或者log数据。
    (比如插入user表中,开始的信息可以只有name属性, 后面也可以插入包含name 和age属性的user对象,从而实现schema-less)

  • 三种索引功能 地理索引 、 文本索引、TTL索引

  • 单片功能 和灾备方案过一下,非常棒的运用,如何实现高可用
  • 实现一套简单的用户和用户介绍的程序
  • 索引的内存化
  • 多数据源,结合mysql一起整一个项目,把适合的数据放到MongoDB里面

安装和初步使用

  • 安装完之后建立 相应的目录保存 文档和日志,一般 data/db data/log
  • 创建配置文件 mongo.config
    ##数据文件
    dbpath=C:\huangzs\install\MongoDB\data\db
    ##日志文件
    logpath=C:\huangzs\install\MongoDB\data\log\mongo.log

启动

进入到bin 路径下面
mongod –config C:\huangzs\install\MongoDB\mongo.config
然后打开一个新的cmd窗口
mongo 即可

基本指令

参考:http://www.yiibai.com/mongodb/mongodb_quick_guide.html

  • 数据库操作

    创建/使用数据库
    use newdb
    查看所有数据库,只有插入了至少一条数据,才会显示出来
    show dbs
    进入该数据库后 删除该数据库
    db.dropDatabase()
    查看当前数据库下所有的表(集合)
    show collections
  • 表级别增删改查

    db.COLLECTION_NAME.insert(document)
    db.COLLECTION_NAME.find()
    db.COLLECTION_NAME.find().pretty()
    db.COLLECTION_NAME.findOne()
    只展示name字段,不展示id
    db.user.find({},{"name":1,_id:0})
    *huangzhenshi* like 查询
    db.user.find({"name":/huangzhenshi/})
    数量限制
    db.user.find({"name":/huangzhenshi/}).limit(2)
    结合skip实现分页,从skipIndex开始查,查询pagesize数量
    db.user.find({"name":/huangzhenshi/}).limit(2).skip(2)
    排序
    db.COLLECTION_NAME.find().sort({KEY:1})
    全部删除
    db.mycol.remove()
    db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
    聚合函数 分组求和
    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
    count
    db.shops.find().count()
  • 备份和恢复

    备份 test数据库,备份到 C:\huangzs\install\MongoDB\bin\dump\backup 路径下
    mongodump --db test --out C:\huangzs\install\MongoDB\bin\dump\backup
    恢复数据
    mongorestore
  • 索引相关
    参考blog
    https://www.jianshu.com/p/53c974273218?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    //查看该collection的所有索引
    db.mapinfo.getIndexes()
    # 在loc上面创建2d索引,创建完之后可以使用 $near函数
    > db.mapinfo.ensureIndex({"loc" : "2d"},{"background" : true})
    插入数据:
    db.mapinfo.insert({"category" : "coffee","name" : "digoal coffee bar","loc" : [70,80]})
    db.mapinfo.insert({"category" : "tea","name" : "digoal tea bar","loc" : [70,80]})
    db.mapinfo.insert({"category" : "tea","name" : "hangzhou tea bar","loc" : [71,81]})
    db.mapinfo.insert({"category" : "coffee","name" : "hangzhou coffee bar","loc" : [71,81]})
    索引查询数据:所有的咖啡店,位置靠近 精度 维度69 69的店,会默认按照near排序的
    db.mapinfo.find({loc : {$near : [69,69]},"category" : "coffee"})
    # 找出限制离[50,50]在37 的商店,使用maxDistance
    > db.mapinfo.find({"loc" : {"$near" : [50,50], "$maxDistance" : 37},"category" : "shop"})
    // maxDistance单位是弧度, 地球表面1弧度距离约为6378137米, 0.001弧度距离为6378米
    db.col.find({"loc": {$near: [longtitude, lattitude], $maxDistance:0.1}})

全文检索命令

db.posts.ensureIndex({post_text:"text"})
db.posts.dropIndex("post_text")
db.posts.find({$text:{$search:"runoob"}})
//排除掉含java的检索结果
db.posts.find({$text:{$search:"runoob -java"}})

demo

  • 基于地理位置的搜索功能(Done)
  • 做一个大的日志保存和搜索的功能
  • 练习一下负载均衡和单片扩展的功能。支持创建唯一索引、二级索引、TTL索引和地理位置索引等
  • 多数据源的引入,和mysql整合在一起使用

实战1(整合spring注解)

依赖jar

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.data.mongodb>1.9.2.RELEASE</spring.data.mongodb>
<mongodb.java.driver>3.2.2</mongodb.java.driver>
<fastjson.version>1.2.3</fastjson.version>
<spring.version>4.2.6.RELEASE</spring.version>
<jackson.version>2.7.0</jackson.version>
<junit>3.8.1</junit>
</properties>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>${mongodb.java.driver}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring.data.mongodb}</version>
</dependency>

spring 配置

<mongo:mongo-client id="mongo" replica-set="${mongo.hostport}"/>
<mongo:db-factory dbname="database" mongo-ref="mongo" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo" />
<constructor-arg name="databaseName" value="${mongo.databaseName}" />
</bean>

实体类UserBo,通过mongoDB的注解@Document来实现指定集合和ID

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection="user_test")
public class UserBo implements Serializable{
private static final long serialVersionUID = 2928923917001675021L;
@Id
private String id; //对应文档里面的 _id
private String userNo;

引入mongoTemplate直接操作

@Autowired
private MongoTemplate mongoTemplate;
public UserBo save(UserBo userBo) {
mongoTemplate.save(userBo);
return userBo;
}

实战 位置查询

//查找point(100,50)附近相差2度的所有店铺,获取到的是 List哎
public void testCircle(){
Circle circle = new Circle(100, 50, 2);
List<Shop> find = mongoTemplate.find(new Query(Criteria.where("location").within(circle)), Shop.class);
System.out.println(find);
System.out.println(find.size());
}
/**等价于 这个sql,距离 100 50这个点距离100KM以内的所有的店
* db.shops.find( { location : { $geoWithin :
{ $centerSphere :
[ [ 100 , 50 ] , 62.137119/ 3963.2 ]
} } } )
*/
public void testNear(){
Point point = new Point(100, 50);
//10km
Sphere sphere = new Sphere(point, 62.137119 / 3963.2);
List<Shop> venues =
mongoTemplate.find(new Query(Criteria.where("location").within(sphere)), Shop.class);
System.out.println(venues.size());
System.out.println(venues);
}
Contents
  1. 1. 示例源码
  2. 2. 特点
    1. 2.1. 特点描述
  3. 3. 单片集群功能
  4. 4. 适用场景
  5. 5. 有待学习的
  6. 6. 安装和初步使用
    1. 6.1. 启动
  7. 7. 基本指令
  8. 8. 全文检索命令
  9. 9. demo
  10. 10. 实战1(整合spring注解)
  11. 11. 实战 位置查询