• 1. 分享人:酷酷
  • 2. Why MongoDB Is Awesome
  • 3. (本页无文本内容)
  • 4. 4NoSQL四大类ExamplesTokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB典型应用场景内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。数据模型Key 指向 Value 的键值对,通常用hash table来实现强项查找速度快弱项数据无结构化,通常只被当作字符串或者二进制数据1.key-value存储
  • 5. 5NoSQL四大类ExamplesCassandra, HBase, Riak典型应用场景分布式的文件系统数据模型以列簇式存储,将同一列数据存在一起强项查找速度快,可扩展性强,更容易进行分布式扩展弱项功能相对局限2.列式数据库
  • 6. 6ExamplesCouchDB, MongoDb典型应用场景Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)数据模型Key-Value对应的键值对,Value为结构化数据强项数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构弱项查询性能不高,而且缺乏统一的查询语法。3.文档型数据库 NoSQL四大类
  • 7. 7ExamplesNeo4J, InfoGrid, Infinite Graph典型应用场景社交网络,推荐系统等。专注于构建关系图谱数据模型图结构强项利用图结构相关算法。比如最短路径寻址,N度关系查找等弱项很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。4.图结构数据库 NoSQL四大类
  • 8. 8MongoDB简介 谁在使用?
  • 9. 9MongoDB简介 Mongo 是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。
  • 10. 10MongoDB简介 特点 高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 模式自由。 支持动态查询。 支持完全索引,包含内部对象。 支持查询。 支持复制和故障恢复。 使用高效的二进制数据存储,包括大型对象(如视频等)。 自动处理碎片,以支持云计算层次的扩展性 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序, 社区中也提供了对Erlang 及.NET等平台的驱动程序。 文件存储格式为BSON(一种JSON的扩展) 可通过网络访问
  • 11. 11MongoDB简介 适用场合 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源 过载。 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。
  • 12. 12MongoDB简介 不适用场合 1.高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。 2.传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
  • 13. 13MongoDB操作 安装 wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-1.2.4.tgz tar -zxvf mongodb-linux-x86_64-1.2.4.tgz mkdir -p /data/db cd /data/db mkdir m_data m_log cd mongodb-linux-x86_64-1.2.4 启动: bin/mongod --dbpath=/data/db/m_data --logpath=/data/db/m_log --logappend --port=27017 &
  • 14. 14
  • 15. 15
  • 16. 16
  • 17. 17
  • 18. 18
  • 19. 19MongoDB操作 INSERT 使用 insert 插入文档。(insert into blog.users values(“user1”,”23)) > use blog switched to db blog > u = { name:"user1", age:23 } > db.users.insert(u)
  • 20. 20_id和ObjectId作用MongoDB中存储的文档必须有一个“_id”键。这个键可以是任意类型, 默认是ObjectId。 ObjectId的组合: 0 | 1 | 2 | 3 4 | 5 | 6 7 | 8 9 | 10 | 11 时间戳 机器 PID 计数器 1.时间戳:时间不断变化 的 2.机器:主机的唯一标识码。通常是机器主机名的散列值,这样可以确保不同主机 生成不同的ObjectId,不产生冲突。 3.PID:为了确保在同一台机器上并发的多个进程产生的ObjectId是唯一的, 所以加上进程标识符(PID). 4.计数器:九个字节保证了同一秒钟不同机器不同进程产生的ObjectId是唯一的。 后三个字节就是一个自动增加的计数器,确保相同进程同一秒产生的ObjectId也是 ObjectId也不是不一样。同一秒最多允许每个进程拥有16 777 216个不同的ObjectId。
  • 21. 212. Query MongoDB 支持多种复杂的查询方式,能实现大多数 T-SQL 功能,远不是 Key-Value 之类的 NoSQL DB 所能比拟的。 相关函数操作看上去非常像 .NET/C# Linq Method Syntax。 有关查询优化和索引的细节请参考后文。 主要用到的查询函数式 find() 和 findOne(),前者返回一个迭代器 cursor,后者返回单个文档。 WHERE # select * from users where name = 'user1' > db.users.find({name:"user1"}) { "_id" : ObjectId("4c4528a0b55f2224d447e4b0"), "name" : "user1", "age" : 21, "sex" : 1 } # select * from users where name = 'user1' and age = 21 > db.users.find({name:"user1", age:21}) { "_id" : ObjectId("4c4528a0b55f2224d447e4b0"), "name" : "user1", "age" : 21, "sex" : 1 } MongoDB操作
  • 22. 22FIELDS # select name, age from users where age = 21 > db.users.find({age:21}, {'name':1, 'age':1}) { "_id" : ObjectId("4c452c343d48c8f284b388e0"), "name" : "user1", "age" : 21 } # select name, age from users > db.users.find({}, {'name':1, 'age':1}) SORT # select * from users order by age > db.users.find().sort({age:1}) # select * from users order by sex asce, age desc > db.users.find().sort({sex:1, age:-1}) SLICE # select * from users skip 2 limit 3 > db.users.find().skip(2).limit(3) Conditional Operators # select * from users where sex = 1 and age > 23 and age < 28 > db.users.find({sex:1, age:{$gt:23, $lt:28}}) 比较操作包括:$gt (>)、$lt (<)、$gte (>=)、$lte(<=)、$ne (!=)。
  • 23. 23(6) IN # select * from users where age in (23, 26, 32) > db.users.find({age:{$in:[23,26,32]}}) 对应的操作符有 $nin (not in)。 (7) COUNT # select count(*) from users where age > 30 > db.users.find({age:{$gt:30}}).count() OR # select * from users where age = 25 or age = 28 # select * from users where age <= 23 or age >= 33 > db.users.find({$or:[{age:25}, {age:28}]}) > db.users.find({$or:[{age:{$lte:23}}, {age:{$gte:33}}]})MongoDB操作
  • 24. 24Update 可直接用类似 T-SQL 条件表达式更新,或用 Save() 更新从数据库返回到文档对象。 # update users set age = 100, sex = 0 where name = 'user1' > db.users.update({name:"user1"}, {$set:{age:100, sex:0}}) update() 有几个参数需要注意。 db.collection.update(criteria, objNew, upsert, mult) criteria: 需要被更新的条件表达式 objNew: 更新表达式 upsert: 如目标记录不存在,是否插入新文档。 multi: 是否更新多个文档。 # update users set age = age + 10 > db.users.update({}, {$inc:{age:10}}, false, true) # update users set age = age + 10, sex = 1 where name = 'user1' > db.users.update({name:"user1"}, {$inc:{age:10}, $set:{sex:1}}) Remove remove() 用于删除单个或全部文档,删除后的文档无法恢复。 > id = db.users.findOne({name:"user2"})._id ObjectId("4c4508818c4a1e0bf570460f") > db.users.remove(id) //移除name='use2'的行 > db.users.remove()//移除所有
  • 25. 25MongoDB: Index// single ascending db.colors.ensureIndex({name: 1}) // non-blocking in background db.colors.ensureIndex({name: 1}, {background: true}) // unique db.colors.ensureIndex({email: 1}, {unique: true}) // single descending db.colors.ensureIndex({created_at: -1}) // compound > db.colors.ensureIndex({name: 1, created_at: -1})
  • 26. 26MongoDB:Aggregation1.> db.colors.count() >6 2. > db.colors.distinct('name') [ "blue", "green", "orange", "purple", "red", "yellow" ] 3. > db.items.insert({title:'Home', template:'home'}) > db.items.insert({title:'What We Do', template:'page'}) > db.items.insert({title:'Our Writing', template:'page'}) > db.items.insert({title:'Who We Are', template:'page'}) > db.items.insert({title:'Hire Us', template:'page'}) > var key = {template: true}; > var initial = {count:0}; > var reduce = function(obj, prev) { prev.count += 1; }; > db.items.group({key:key, initial:initial, reduce:reduce}) [ {"template" : "home", "count" : 1}, {"template" : "page", "count" : 4} ]
  • 27. 27Similar Data Types
  • 28. 28> db.people.insert({ name : 'John', awesome : true, shows : ['Dexter', 'LOST', 'How I Met Your Mother'], info : { age : 28, home: 'South Bend, IN', dob : (new Date('November 25, 1981')) } }) > var me = db.people.findOne({name:'John'}) > me.name John > me.awesome true > me.shows[1] LOST > me.info.age 28 > me.info.dob.getFullYear() 1981
  • 29. 29 One to Many 一、 Normalized// insert post > db.posts.insert({title:'Why Mongo Rocks'}); > var post = db.posts.findOne({title:'Why Mongo Rocks'}); // insert comment > db.comments.insert({ name :'John', body :'Because...', post_id : post._id }); var comment = db.comments.findOne({name:'John'}); > db.comments.find({post_id: post._id}) { "_id" : ObjectId("4bee1cc79e89db4e12bf78de"), "name" : "John", "body" : "Because...", "post_id" : ObjectId("4bee1c519e89db4e12bf78dd") }
  • 30. 30二、Embedded关系型数据库的存储方式:
  • 31. 31MongoDB的存储方式:
  • 32. 32例如:{ "VendroId": 1, "Name": "商家1", "ItemInfo": [ { "ItemId": "634422022659939961", "ItemName": "商品634422022659939961", "ServiceCateId": 1 }, { "ItemId": "634422022659949961", "ItemName": "商品634422022659949961", "ServiceCateId": 1 } ], "_id": "4de0c71bbeb52e0ecc000001" } db.VendorInfo.find({“ItemInfo”:{“$elemMatch”:{"ItemId", "634422022659949961"}}})
  • 33. 33
  • 34. 34Many to Manydb.sites.insert({domain: 'orderedlist.com'}) db.sites.insert({domain: 'railstips.org'}) > db.sites.find() { "_id" : ObjectId("4bee280f9e89db4e12bf78e2"), "domain": "orderedlist.com" } { "_id" : ObjectId("4bee283c9e89db4e12bf78e3"), "domain": "railstips.org" }
  • 35. 35> db.users.insert({ name: 'John', authorizations: [ ObjectId('4bee280f9e89db4e12bf78e2'), ObjectId('4bee283c9e89db4e12bf78e3') ] }) > db.users.insert({ name: 'Steve', authorizations: [ ObjectId('4bee280f9e89db4e12bf78e2') ] }) > var orderedlist = db.sites.findOne({domain:'orderedlist.com'}) db.users.find({authorizations:orderedlist._id}) > var railstips = db.sites.findOne({domain:'railstips.org'}) db.users.find({authorizations:railstips._id}) > var john = db.users.findOne({name:'John'}) > db.sites.find({_id:{$in: john.authorizations}})
  • 36. 36Tools Performance Indicators Remedies
  • 37. 371. mongostat
  • 38. 382. serverStatus
  • 39. 393. Profiler􀀀> db.setProfilingLevel(2) { "was" : 0, "slowms" : 100, "ok" : 1 } > db.system.profile.find().sort({$natural: -1}) { "ts" : ISODate("2011-05-24T14:20:09.711Z"), "info" : "query docs.spreadsheets reslen:257 nscanned:1805535 query: { query: {}, $explain: true } nreturned:1 1407ms", "millis" : 1407 }
  • 40. 40Memcached与MongoDB结合PCMemcachedMongoDBDB
  • 41. 41
  • 42. 42
  • 43. 43
  • 44. 44
  • 45. (本页无文本内容)