MongoDB
示例源码
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字段,不展示iddb.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}}}])countdb.shops.find().count()备份和恢复
备份 test数据库,备份到 C:\huangzs\install\MongoDB\bin\dump\backup 路径下mongodump --db test --out C:\huangzs\install\MongoDB\bin\dump\backup恢复数据mongorestore-
//查看该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}})
全文检索命令
|
demo
- 基于地理位置的搜索功能(Done)
- 做一个大的日志保存和搜索的功能
- 练习一下负载均衡和单片扩展的功能。支持创建唯一索引、二级索引、TTL索引和地理位置索引等
- 多数据源的引入,和mysql整合在一起使用
实战1(整合spring注解)
依赖jar
spring 配置
实体类UserBo,通过mongoDB的注解@Document来实现指定集合和ID
引入mongoTemplate直接操作
实战 位置查询
|