Mongodb学习笔记.docx_第1页
Mongodb学习笔记.docx_第2页
Mongodb学习笔记.docx_第3页
Mongodb学习笔记.docx_第4页
Mongodb学习笔记.docx_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NOTES 研究内容规划一、方向:1. NoSQL:MongoDB2. Cache:Zend_Cache3. 运行平台:CentOS Nginx PHP MongoDB Memecached MySQL二、现状:1.NoSQL相比较而言是比较陌生的,能够掌握熟练应用需要的时间也应该会比较长。2.Cache方面Zend_Cache早有接触,只是在项目应用中使用过少。3.运行平台的搭建是一个需要掌握的基本技术,需要在这个过程中熟练运用。4.这样安排也是一个从单一到综合的过程三、目的:1.走在技术发展的趋势前沿2.提升技术水平层次,有质的提升3. 以大吞吐的数据并发为假想,组建低成本、高性能的服务器平台环境。四、难点:1.数据库设计理念:从MySQL到NoSQL的过程首先是一个从关系数据库设计理念向非关系数据库的一个大转折,首先解决的是数据库的设计理念的转变。2.全局观念:从单独数据库、缓存到服务器平台是单一技术到技术架构层面的质的飞跃,需要有全局概念,也就是更全面的知识结构,更深的技术水准。3.真实运行环境:“大吞吐量数据并发”仅仅是假想环境,真实环境更为复杂,需要解决的问题会更多。目录:第一部分:NoSQL:MongoDB第二部分:Cache思想第三部分:综合运用,从架构层面解决实际问题第一部分:NoSQL:MongoDB第一章:概述MongoDB是一个强大、灵活、可扩展性好的文档数据存储器,可以完成大部分关系数据所具备的功能Document-Oriented面向文档数据库用“Document”替代关系数据库的“Row”的概念Schema-free模式自由Easy Scaling 易扩展Features特性:l Indexing索引l Stored JavaScript 开发者能在服务器端使用和存储javascript方法、变量l Aggregation 聚合器,MangoDB支持MapReduce和其它聚合器工具l Fixed-Size Collectionsl File Storage文件存储,支持大文件存储及文件的元数据Without Sacrificing Speed不牺牲速度Simple Administration管理简单Master down机时MangoDB可以自动将Slave切换为Master第二章 开始基本概念l Document 一个document相当于RMDBMS中Rowl Collection 相当于一个没有模式限制的Tablel 一个MongoDB实例可以有多个无关的数据库,里面保存我们的Collection和许可l MongoDB有一个简单而又强大的JavaScript Shell,我们常用来管理MongoDB,类似于MySql总的Sql语句的作用l 每一个Document都有一个特殊的key:“_id”,用它来作为Document的Collection的唯一标识DocumentDocument是MongoDB的一个核心概念,用key关联着valueCollections一个Collections就是多个Document的组合。假如说mongoDB的Document是关系数据库的一个行(row)的话,那Collection就是关系数据库的一个表(table)Schema-Free模式自由mongoDB的Collection不受类似关系数据库中的一、二、三范式思想的束缚,没有可以没有固定的类似数据字段式的结构,也就是在同一个Collection中可以有多种结构的DocumentNaming命名每个Collection是用名字来做唯一标识,它的名字可以是任何utf8字符,同时也有点限制:不能使用空字符串(“”)Collection不能用字符0(空字符)不能以system.做Collection名称前缀,因为system.是作为系统预留的,比如system.users保存数据库的用户信息用户创建collection是不能用“$”这个保留字Subcollections 子集如果已经有个blog collection,这时有个叫blog.posts的collection,那么这个就是blog的subcollectionSubcollection虽然在mongoDB中没有特殊的功能,但是在mongoDB的一些工具中特别有用:l GridFSl Web consolel 某些驱动在mongoDB中subcollection可以非常好的组织数据,所以这种用法非常推荐Databases数据库在将document加入collection之前,mongoDB需要将collection加到数据库中,一个MongoDB主机上通常会有多个数据库,它们之间也可能互不相关。一个数据库拥有一个许可,并且在硬盘上用特定的文件存储。l 与Collection类似,Database也是用name作为唯一标识,可以用几乎任何UTF8字符来命名,l 不能用空字符串命名(”)l 名称中不能使用这些字符:空格( ),点(.),美元符号($),斜杠(/),反斜杠(),null(0)l 数据库名称必须是小写字母l 数据库名称字符长度不能多于64位(bytes)也是由于数据库将以其名称为文件名存储在系统中,所以才有了以上的命名限制同时还有几个保留的数据库名称:l admin 这个是根级数据库,假如有个用户加到 admin数据中的话那么这个用户将自动集成所有数据库的许可,它就可以在服务器端运行命令,比如列出所有的数据库或者关闭服务等命令l local 这个数据库不会被复制它所存储的任何collections,它只能在各自的服务器实例本身上l config 在分布式sharding设置时将用于相关的信息存储Getting and Starting MongoDBMongoDB Shell它是完全支持JavaScript解析能够运行所有的javaScript程序,MongoDB客户端客户端初始连接数据库服务器时后默认连接到的当前数据库是test数据库use 切换数据库 Basic Operations with the Shell基本的shell操作(CRUD)Creat:insert方法用了将document插入到collection中 post = title : My Blog Post,. content : Heres my blog post.,. date : new Date() title : My Blog Post, content : Heres my blog post., date : Sat Dec 12 2009 11:23:21 GMT-0500 (EST)db.blog.insert(post) 执行插入db.blog.find() 查看结果Readfind方法可以返回一个collection中的所有document,findOne方法用来返回一个document,这两个方法是用了查询数据的db.blog.find()db.blog.findOne()Updade ments = db.blog.update(title : My Blog Post, post) /更新title=” My Blog Post”的document的属性comments db.blog.find() _id : ObjectId(4b23c3ca7525f35f94b60a2d), title : My Blog Post, content : Heres my blog post., date : Sat Dec 12 2009 11:23:21 GMT-0500 (EST) comments : Delete删除一个document用remove方法 db.blog.remove(title : My Blog Post) /删除title为My Blog Post的所有documentTips for Using the Shell helpHELP show dbs show database names show collections show collections in current database show users show users in current database show profile show recent file entries w. time = 1ms use set current database to db.help() help on DB methods db.foo.help() help on collection methods db.foo.find() list objects in collection foo db.foo.find( a : 1 ) list objects in foo where a = 1it result of the last line evaluateddb.help()db.foo.help() db.foo.update /显示update方法的定义过程function (query, obj, upsert, multi) assert(query, need a query); assert(obj, need an object); this._validateObject(obj);this._mongo.update(this._fullName, query, obj, upsert ? true : false, multi ? true : false);让人看起来不舒服的collection 名称 db.version/version内建方法function () return this.serverBuildInfo().version; db.getCollection(version); /version是个collectiontest.versionData Types 数据类型Basic Data TypesDocument使用的是Json风格的数据,但是json数据支持的类型有限,仅仅支持null, boolean, numeric, string, array, 和 objectMongoDB支持的数据类型:Null x : nullBoolean x : true32-bit integer 32位整型64-bit integer 64位整型64-bit floating point number 64位浮点数,所有数字在shell都是这个类型 x : 3.14 x : 3String 所有字符都是使用utf8类型 x : foobarSymbol 该类型在shell中是不支持的,假如在shell中获取一个symbol类型的数据将会转换成字符串object id document的object id是一个12位的唯一id x : ObjectId()date x : new Date()regular expression 正则表达式,支持javaScript的正则表达式 x : /foobar/icode document可以包含JavaScript代码 x : function() /* . */ binary data 二进制数据 ,是字节专用的字符串,它不能在shell中操控maximum valueminimum valueundefined 这与JavaScript中的null和undefined不同 x : undefinedarray x : a, b, cembedded document x : foo : barNumbersDatesJavaScript的date类型Arraysthings : pie, 3.14Embedded Documents name : John Doe, address : street : 123 Park Street, city : Anytown, state : NY _id and ObjectIdsObjectIdsObjected使用的是12位存储,用24个16进制数字表示(两个数字占1位)。12位ObjectId的产生规则:Autogeneration of _id第三章:创建、更新和删除Document插入和保存 Documents db.foo.insert(bar : baz)批量插入在插入多个document的情况下批量插入更加快速高效db.foo.insert(bar : baz,bar : baz1,bar : baz2)Removing Documents db.users.remove() db.mailing.list.remove(opt-out : true)Remove Speed如果是只删除一条符合条件的document的话remove方法比drop更高效(删除后会重新索引)但是要删除大量数据的时候drop就更比remove高效多,下面是一个实例代码(Python):插入100万个documentfor i in range(1000000):collection.insert(foo: bar, baz: i, z: 10 - i)做删除操作import timefrom pymongo import Connectiondb = Connection().foocollection = db.barstart = time.time()collection.remove()collection.find_one()total = time.time() - startprint %d seconds % total这段删除操作代码在一个MacBook Air本本上显示的执行时间为46.08 seconds将上面代码中的remove和find_one替换为db.drop_collection(bar),删除只需要.01秒,这是一个重大的改进。在这个过程中bar collection被删除了,索引也会被删除Updating Documents修饰符:$inc: _id : ObjectId(4b253b067525f35f94b60a31), url : , pageviews : 52 db.analytics.update(url : ,. $inc : pageviews : 1) db.analytics.find() _id : ObjectId(4b253b067525f35f94b60a31), url : , pageviews : 53$set: db.users.findOne() _id : ObjectId(4b253b067525f35f94b60a31), name : joe, age : 30, sex : male, location : Wisconsin db.users.update(_id : ObjectId(4b253b067525f35f94b60a31),. $set : favorite book : war and peace) db.users.findOne() _id : ObjectId(4b253b067525f35f94b60a31), name : joe, age : 30, sex : male, location : Wisconsin, favorite book : war and peace db.users.update(name : joe,. $set : favorite book : green eggs and ham) db.users.update(name : joe,. $set : favorite book :. cats cradle, foundation trilogy, enders game) db.users.update(name : joe,. $unset : favorite book : 1) db.blog.posts.findOne() _id : ObjectId(4b253b067525f35f94b60a31), title : A Blog Post, content : ., author : name : joe, email : db.blog.posts.update( : joe, $set : : joe schmoe) db.blog.posts.findOne() _id : ObjectId(4b253b067525f35f94b60a31), title : A Blog Post, content : ., author : name : joe schmoe, email : 自增和消耗 db.games.insert(game : pinball, user : joe) db.games.update(game : pinball, user : joe,. $inc : score : 50) db.games.findOne() _id : ObjectId(4b2d75476cc613d5ee930164), game : pinball, name : joe, score : 50 db.games.update(game : pinball, user : joe,. $inc : score : 10000) db.games.find() _id : ObjectId(4b2d75476cc613d5ee930164), game : pinball, name : joe, score : 10050$inc表示自增长数组修饰符$push: db.blog.posts.findOne() _id : ObjectId(4b2d75476cc613d5ee930164), title : A blog post, content : . db.blog.posts.update(title : A blog post, $push : comments :. name : joe, email : , content : nice post.) db.blog.posts.findOne() _id : ObjectId(4b2d75476cc613d5ee930164), title : A blog post, content : ., comments : name : joe, email : , content : nice post. 再来一次 db.blog.posts.update(title : A blog post, $push : comments :. name : bob, email : , content : good post.) db.blog.posts.findOne() _id : ObjectId(4b2d75476cc613d5ee930164), title : A blog post, content : ., comments : name : joe, email : , content : nice post. , name : bob, email : , content : good post. $ne db.papers.update(authors cited : $ne : Richie,. $push : authors cited : Richie)$addToSet: db.users.findOne(_id : ObjectId(4b2d75476cc613d5ee930164) _id : ObjectId(4b2d75476cc613d5ee930164), username : joe, emails : , , db.users.update(_id : ObjectId(4b2d75476cc613d5ee930164),. $addToSet : emails : ) db.users.findOne(_id : ObjectId(4b2d75476cc613d5ee930164) _id : ObjectId(4b2d75476cc613d5ee930164), username : joe, emails : , , , db.users.update(_id : ObjectId(4b2d75476cc613d5ee930164),. $addToSet : emails : ) db.users.findOne(_id : ObjectId(4b2d75476cc613d5ee930164) _id : ObjectId(4b2d75476cc613d5ee930164), username : joe, emails : , , , $each: db.users.update(_id : ObjectId(4b2d75476cc613d5ee930164), $addToSet :. emails : $each : , , ) db.users.findOne(_id : ObjectId(4b2d75476cc613d5ee930164) _id : ObjectId(4b2d75476cc613d5ee930164), username : joe, emails : , , , $pop:$pull:(相当于删除一个数组元素) db.lists.insert(todo : dishes, laundry, dry cleaning) db.lists.update(, $pull : todo : laundry) db.lists.find() _id : ObjectId(4b2d75476cc613d5ee930164), todo : dishes, dry cleaning Positional array modifications db.blog.posts.findOne()_id : ObjectId(4b329a216cc613d5ee930192), content : ., comments : comment : good post, author : John, votes : 0 , comment : i thought it was too short, author : Claire, votes : 3 , comment : free watches, author : Alice, votes : -1 db.blog.update(post : post_id,. $inc : comments.0.votes : 1)db.blog.update(comments.author : John,. $set : comments.$.author : Jim)Modifier speedfrom pymongo import Connectionimport timedb = Connection().performance_testdb.drop_collection(updates)collection = db.updatescollection.insert(x: 1)# make sure the insert is complete before we start timingcollection.find_one()start = time.time()for i in range(100000): collection.update(, $inc : x : 1)# make sure the updates are complete before we stop timingcollection.find_one()print time.time() startOn a MacBook Air this took 7.33 seconds. Thats more than 13,000 updates per second使用$pushfor i in range(100000):collection.update(, $push : x : 1)67.58 seconds to run, which is less than 1,500 updates per second.Upserts/ check if we have an entry for this pageblog = db.analytics.findOne(url : /blog)/ if we do, add one to the number of views and saveif (blog) blog.pageviews+; db.analytics.save(blog);/ otherwise, create a new document for this pageelse db.analytics.save(url : /blog, pageviews : 1)db.analytics.update(url : /blog, $inc : visits : 1, true) db.math.remove() db.math.update(count : 25, $inc : count : 3, true) db.math.findOne() _id : ObjectId(4b3295f26cc613d5ee93018f), count : 28 var x = db.foo.findOne() x.num = 4242 db.foo.save(x)Updating Multiple Documents更新多个文档 db.users.update(birthday : 10/13/1978,. $set : gift : Happy Birthday!, false, true) db.count.update(x : 1, $inc : x : 1, false, true) db.runCommand(getLastError : 1) err : null, updatedExisting : true, n : 5, ok : trueReturning Updated Documents _id : ObjectId(), status : state, priority : Nps = cesses.find(status : READY).sort(priority : -1).limit(1).next()cesses.update(_id : ps._id, $set : status : RUNNING)do_something(ps);cesses.update(_id : ps._id, $set : status : DONE)var cursor = cesses.find(status : READY).sort(priority : -1).limit(1);while (ps = cursor.next() != null) ps.update(_id : ps._id, status : READY, $set : status : RUNNING); var lastOp = db.runCommand(getlasterror : 1); if (lastOp.n = 1) do_something(ps); cesses.update(_id : ps._id, $set : status : DONE) break; cursor = cesses.find(status : READY).sort(priority : -1).limit(1); ps = db.runCommand(findAndModify : processes,. query : status : READY,. sort : priority : -1,. update : $set : status : RUNNING) ok : 1, value : _id : ObjectId(4b3e7a18005cab32be6291f7), priority : 1, status : READY cesses.findOne(_id : ps.value._id) _id : ObjectId(4b3e7a18005cab32be6291f7), priority : 1, status : RUNNING ps = db.runCommand(findAndModify : processes,. query : status : READY,. sort : priority : -1,. update : $set : status : RUNNING).value do_something(ps) cess.update(_id : ps._id, $set : status : DONE) ps = db.runCommand(findAndModify : processes,. query : status : READY,. sort : priority : -1,. remove : true).value do_something(ps)第四章:查询Introduction to find db.c.find() db.users.find(age : 27) db.users.find(username : joe db.users.find(username : joe, age : 27)Specifying Which Keys to Return指定返回的键 db.users.find(, username : 1, email : 1) _id : ObjectId(4ba0f0dfd22aa494fd523620), username : joe, email : db.users.find(, fatal_weakness : 0)/不返回fatal_weakness这个键 db.users.find(, username : 1, _id : 0) /返回的键包含username,但不返回_id username : joe,Query Criteria规则Query Conditionals查询条件$lt, $lte, $gt, and $gte, , =, db.users.find(age : $gte : 18, $lte : 30) / 18 = age start = new Date(01/01/2007) db.users.find(registered : $lt : start) /注册时间在01/01/2007之前 db.users.find(username : $ne : joe)/username等于joeOR Queries其它问题类似sql语句中的in、 or、 not in等方法 db.raffle.find(ticket_no : $in : 725, 542, 390) db.users.find(user_id : $in : 12345, joe) db.raffle.find(ticket_no : $nin : 725, 542, 390) /not in db.raffle.find($or : ticket_no : 725, winner : true) db.raffle.find($or : ticket_no : $in : 725, 542, 390, winner : true)$not db.users.find(id_num : $mod : 5, 1) db

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论