- 1. weddeMongoDB基础开发(Java)
- 2. 分享目标:
帮助开发人员快速掌握使用java进行mongoDB开发的基础知识,减少自主学习时间。
内容概述:
mongoDB安装、shell操作、数据库基础管理、数据模型设计;
Java开发基础,spring mongoTemplate使用(依赖库、配置、典型代码等),原生java驱动使用。
不包括的知识:
基础概述,Replication, Sharding, GridFS, 安全, 备份。
高级查询,聚合、js语句查询、GIS查询、游标、事务?内容介绍
- 3. MongoDB管理基础
特点概述
数据模型设计
安装、管理
Shell操作
数据库基础管理
增删改查
Java开发基础
基于原生Java驱动开发
基于spring mongoTemplate开发目录
- 4. 面向文档的数据库,以BSON格式存储,无schema。
与传统数据库的对应
集合(collection) -> 表
文档(document) -> 行记录(row)
关于事务
仅支持单文档的事务,不支持多文档的事务。
read uncommitted,写操作返回前,其他进程有可能读到写入的数据;即使写操作返回( journal commits前),数据也可能丢失(断电/重启……)。
MongoDB倾向于使用更多的内存处理数据,缓存查询结果等。增加内存会有效提升性能。MongDB特点概述
- 5. 每一个文档都有一个特殊的字段“_id”。
默认12字节,系统生成,时间4+机器3+进程2+计数3;
也可自己指定_id的值,保证唯一即可,比如自增序列。
单文档最大16M,但采用GridFS则无限制。
不需要遵循关系数据库的3NF原则,但在违反之前要有充分的理由。
数据模型设计要考虑:存储效率、查询、扩展性等。
考虑对象嵌套,数组/列表;
不支持join,根据查询行为考虑索引的创建;
考虑冗余数据,考虑文档大小的增长,优化性能;数据模型设计
- 6. 一个客户有多个地址
类似:
书籍的借阅记录
某商品的评论
订单的物流记录
……典型数据模型举例1 – 送货地址相互之间无联系,无需统计,通常从属父对象进行管理
- 7. 书籍 -> 出版社
类似:
朋友圈点赞
im好友分组
典型数据模型举例2 – 出版社
- 8. 个性化推荐记录
典型数据模型举例3 - CRM
- 9. Windows下安装
下载、执行安装
配置数据存储位置,所在磁盘的/data/db/
可配置成后台服务随系统启动
Linux下安装(Ubuntu举例)
添加MongoDB的公钥
使用sudo apt-get install mongodb-org
启动
默认的数据存储位置在/data/db/,也可以在启动时通过命令行参数指定。安装、管理
- 10. 以Javascript语法交互的命令行程序。
可以定义变量/函数
启动shell: mongo
查看数据库列表:show dbs
切换到指定数据库:use [db name]
查看当前数据库集合列表:show collections
查看当前数据库信息:db.stats()
查看集合信息:db.[collection name].stats()
查看数据库当前状态:db.serverStatus()
删除当前数据库:db.dropDatabase()MogoDB Shell基本操作
- 11. 插入有三种方式:insert, save, upsert,适用不同场景。
举例:
db.products.insert( { item: "card", qty: 15 } )
db.inventory.save( { type: "book", item: "notebook", qty: 40 } )
db.inventory.update(
{ type: "book", item : "journal" },
{ $set : { qty: 10 } },
{ upsert : true } )
如果待保存对象不存在’_id’属性,则系统自动创建;如果有,则系统会检查是否唯一。插入
- 12. 不支持类似join的语法,where子句使用json对象表达。
支持传统sql的各种运算符、逻辑表达式,更支持对数组和复杂对象的支持,使用json对象表达。
运算符:
比较,$gt, $gte, $lt, $lte, $ne
逻辑表达,$or, $and, $not, $nor
针对数组,$all, $elemMatch, $size
其他, $in, $nin, $exists
举例:
db.customer.find({'site':'litb', 'custId':8421763}).pretty()
db.inventory.find( { $or:
[ { quantity: { $lt: 20 } }, { price: 10 } ]
} )查询
- 13. {
_id: 100,
type: "food",
item: "xyz",
qty: 25,
price: 2.5,
memos: [
{ memo: "on time", by: "shipping" },
{ memo: "approved", by: "billing" } ]
}
db.inventory.find( { 'memos.by': 'shipping' } )
基于对象的查询
- 14. findOne()
sort()
limit()
skip()
pretty(),让返回结果格式化,更便于阅读。
explain(),查询计划,观察索引使用情况。
举例
db.stocks.find().sort( { ticker: 1, date: -1 } ).limit(100)查询的其他知识
- 15. drop(),删除整个collection,包括索引。
db.[collection name].drop()
remove(),删除符合条件的文档对象,但是不影响索引。
db.inventory.remove( { type : "food" } )
删除
- 16. 修改举例
db.people.update(
{ name: "Andy" },
{
name: "Andy",
rating: 1,
score: 1
},
{ upsert: true }
)
- 17. $inc, $mul, $rename, $set, $unset, $min, $max
举例
db.products.update( { _id: 1 }, { $mul: { price: 1.25 } } )
db.products.update(
{ sku: "abc123" },
{ $inc: { quantity: -2, sales: 2 } } )
db.customer.update(
{},
{$unset: {'recomms':[]} },
{multi:true})
局部修改
- 18. $pop, $pullAll, $pull, $push
举例
db.customer.update(
{'site': 'mini'},
{$pull:
{'recomms.at':
{$lt: '2014-06-28'}
}
},
{multi: true}
)针对数组的修改
- 19. 核心是DBObject接口,各类对象都以此为核心。
BasicDBObject是简单数据对象的封装,数据对象也可实现DBObject接口。
连接
保存基于原生Java驱动开发
- 20. 不同的场景区分为两类访问方式
Spring Data Repositories
MongoTemplate
写安全 - WriteConcern基于spring mongoTemplate开发
- 21. 配置文件
- 22. find(), findAll(), findOne()
代码举例:查询的代码举例
- 23. 删除
- 24. upsert代码举例
- 25. 更新customer对象,并且向客户的推荐产品列表中插入新的推荐列表。
还有updateMulti()方法。更复杂的更新 - 数组对象
- 26. 删除数组中的元素
- 27. Spring数据访问参考
http://docs.spring.io/spring-data/data-mongo/docs/1.4.2.RELEASE/reference/html/
Spring MongoDB类库参考
http://docs.spring.io/spring-data/data-mongo/docs/1.5.0.RELEASE/api/
MongoDB手册
http://docs.mongodb.org/manual/
MongoDB Java driver类库
http://api.mongodb.org/java/current/
MongoDB权威指南相关资源