• 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权威指南相关资源