Mongodb学习笔记.docx
- 文档编号:8635661
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:53
- 大小:575.28KB
Mongodb学习笔记.docx
《Mongodb学习笔记.docx》由会员分享,可在线阅读,更多相关《Mongodb学习笔记.docx(53页珍藏版)》请在冰豆网上搜索。
Mongodb学习笔记
NOTES
研究内容规划
一、方向:
1.NoSQL:
MongoDB
2.Cache:
Zend_Cache
3.运行平台:
CentOSNginxPHPMongoDBMemecachedMySQL
二、现状:
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模式自由
EasyScaling易扩展
Features特性:
●Indexing索引
●StoredJavaScript开发者能在服务器端使用和存储javascript方法、变量
●Aggregation聚合器,MangoDB支持MapReduce和其它聚合器工具
●Fixed-SizeCollections
●FileStorage文件存储,支持大文件存储及文件的元数据
…WithoutSacrificingSpeed不牺牲速度
SimpleAdministration管理简单
Masterdown机时MangoDB可以自动将Slave切换为Master
第二章开始
基本概念
●Document一个document相当于RMDBMS中Row
●Collection相当于一个没有模式限制的Table
●一个MongoDB实例可以有多个无关的数据库,里面保存我们的Collection和许可
●MongoDB有一个简单而又强大的JavaScriptShell,我们常用来管理MongoDB,类似于MySql总的Sql语句的作用
●每一个Document都有一个特殊的key:
“_id”,用它来作为Document的Collection的唯一标识
Document
Document是MongoDB的一个核心概念,用key关联着value
Collections
一个Collections就是多个Document的组合。
假如说mongoDB的Document是关系数据库的一个行(row)的话,那Collection就是关系数据库的一个表(table)
Schema-Free模式自由
mongoDB的Collection不受类似关系数据库中的一、二、三范式思想的束缚,没有可以没有固定的类似数据字段式的结构,也就是在同一个Collection中可以有多种结构的Document
Naming命名
每个Collection是用名字来做唯一标识,它的名字可以是任何utf8字符,同时也有点限制:
不能使用空字符串(“”)
Collection不能用字符\0(空字符)
不能以system.做Collection名称前缀,因为system.是作为系统预留的,比如system.users保存数据库的用户信息
用户创建collection是不能用“$”这个保留字
Subcollections子集
如果已经有个blogcollection,这时有个叫blog.posts的collection,那么这个就是blog的subcollection
Subcollection虽然在mongoDB中没有特殊的功能,但是在mongoDB的一些工具中特别有用:
●GridFS
●Webconsole
●某些驱动
在mongoDB中subcollection可以非常好的组织数据,所以这种用法非常推荐
Databases数据库
在将document加入collection之前,mongoDB需要将collection加到数据库中,一个MongoDB主机上通常会有多个数据库,它们之间也可能互不相关。
一个数据库拥有一个许可,并且在硬盘上用特定的文件存储。
●与Collection类似,Database也是用name作为唯一标识,可以用几乎任何UTF8字符来命名,
●不能用空字符串命名(””)
●名称中不能使用这些字符:
空格(’‘),点(.),美元符号($),斜杠(/),反斜杠(\),null(\0)
●数据库名称必须是小写字母
●数据库名称字符长度不能多于64位(bytes)
也是由于数据库将以其名称为文件名存储在系统中,所以才有了以上的命名限制
同时还有几个保留的数据库名称:
●admin这个是根级数据库,假如有个用户加到admin数据中的话那么这个用户将自动集成所有数据库的许可,它就可以在服务器端运行命令,比如列出所有的数据库或者关闭服务等命令
●local这个数据库不会被复制它所存储的任何collections,它只能在各自的服务器实例本身上
●config在分布式sharding设置时将用于相关的信息存储
GettingandStartingMongoDB
MongoDBShell
它是完全支持JavaScript解析能够运行所有的javaScript程序,
MongoDB客户端
客户端初始连接数据库服务器时后默认连接到的当前数据库是test数据库
use
BasicOperationswiththeShell基本的shell操作(CRUD)
Creat:
insert方法用了将document插入到collection中
>post={"title":
"MyBlogPost",
..."content":
"Here'smyblogpost.",
..."date":
newDate()}
{
"title":
"MyBlogPost",
"content":
"Here'smyblogpost.",
"date":
"SatDec12200911:
23:
21GMT-0500(EST)"
}
>db.blog.insert(post)执行插入
>db.blog.find()查看结果
Read
find方法可以返回一个collection中的所有document,findOne方法用来返回一个document,这两个方法是用了查询数据的
db.blog.find()
db.blog.findOne()
Updade
>ments=[]
[]
>db.blog.update({title:
"MyBlogPost"},post)//更新title=”MyBlogPost”的document的属性comments
>db.blog.find()
{
"_id":
ObjectId("4b23c3ca7525f35f94b60a2d"),
"title":
"MyBlogPost",
"content":
"Here'smyblogpost.",
"date":
"SatDec12200911:
23:
21GMT-0500(EST)"
"comments":
[]
}
Delete
删除一个document用remove方法
>db.blog.remove({title:
"MyBlogPost"})//删除title为"MyBlogPost"的所有document
TipsforUsingtheShell
>help
HELP
showdbsshowdatabasenames
showcollectionsshowcollectionsincurrentdatabase
showusersshowusersincurrentdatabase
showprofileshowrecentsystem.profileentriesw.time>=1ms
use
db.help()helponDBmethods
db.foo.help()helponcollectionmethods
db.foo.find()listobjectsincollectionfoo
db.foo.find({a:
1})listobjectsinfoowherea==1
itresultofthelastlineevaluated
>db.help()
>db.foo.help()
>db.foo.update//显示update方法的定义过程
function(query,obj,upsert,multi){
assert(query,"needaquery");
assert(obj,"needanobject");
this._validateObject(obj);
this._mongo.update(this._fullName,query,obj,upsert?
true:
false,multi?
true:
false);
}
让人看起来不舒服的collection名称
>db.version//version内建方法
function(){
returnthis.serverBuildInfo().version;
}
>db.getCollection("version");//version是个collection
test.version
DataTypes数据类型
BasicDataTypes
Document使用的是Json风格的数据,但是json数据支持的类型有限,仅仅支持null,boolean,numeric,string,array,和object
MongoDB支持的数据类型:
Null{"x":
null}
Boolean{"x":
true}
32-bitinteger32位整型
64-bitinteger64位整型
64-bitfloatingpointnumber64位浮点数,所有数字在shell都是这个类型{"x":
3.14}{"x":
3}
String所有字符都是使用utf8类型{"x":
"foobar"}
Symbol该类型在shell中是不支持的,假如在shell中获取一个symbol类型的数据将会转换成字符串
objectiddocument的objectid是一个12位的唯一id{"x":
ObjectId()}
date{"x":
newDate()}
regularexpression正则表达式,支持javaScript的正则表达式{"x":
/foobar/i}
codedocument可以包含JavaScript代码{"x":
function(){/*...*/}}
binarydata二进制数据,是字节专用的字符串,它不能在shell中操控
maximumvalue
minimumvalue
undefined这与JavaScript中的null和undefined不同{"x":
undefined}
array{"x":
["a","b","c"]}
embeddeddocument{"x":
{"foo":
"bar"}}
Numbers
Dates
JavaScript的date类型
Arrays
{"things":
["pie",3.14]}
EmbeddedDocuments
{
"name":
"JohnDoe",
"address":
{
"street":
"123ParkStreet",
"city":
"Anytown",
"state":
"NY"
}
}
_idandObjectIds
ObjectIds
Objected使用的是12位存储,用24个16进制数字表示(两个数字占1位)。
12位ObjectId的产生规则:
Autogenerationof_id
第三章:
创建、更新和删除Document
插入和保存Documents
>db.foo.insert({"bar":
"baz"})
批量插入
在插入多个document的情况下批量插入更加快速高效
db.foo.insert({"bar":
"baz"},{"bar":
"baz1"},{"bar":
"baz2"})
RemovingDocuments
>db.users.remove()
>db.mailing.list.remove({"opt-out":
true})
RemoveSpeed
如果是只删除一条符合条件的document的话remove方法比drop更高效(删除后会重新索引)
但是要删除大量数据的时候drop就更比remove高效多,下面是一个实例代码(Python):
插入100万个document
foriinrange(1000000):
collection.insert({"foo":
"bar","baz":
i,"z":
10-i})
做删除操作
importtime
frompymongoimportConnection
db=Connection().foo
collection=db.bar
start=time.time()
collection.remove()
collection.find_one()
total=time.time()-start
print"%dseconds"%total
这段删除操作代码在一个MacBookAir本本上显示的执行时间为46.08seconds
将上面代码中的remove和find_one替换为db.drop_collection("bar"),删除只需要.01秒,这是一个重大的改进。
在这个过程中barcollection被删除了,索引也会被删除
UpdatingDocuments
修饰符:
$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":
{"favoritebook":
"warandpeace"}})
>db.users.findOne()
{
"_id":
ObjectId("4b253b067525f35f94b60a31"),
"name":
"joe",
"age":
30,
"sex":
"male",
"location":
"Wisconsin",
"favoritebook":
"warandpeace"
}
>db.users.update({"name":
"joe"},
...{"$set":
{"favoritebook":
"greeneggsandham"}})
>db.users.update({"name":
"joe"},
...{"$set":
{"favoritebook":
...["cat'scradle","foundationtrilogy","ender'sgame"]}})
>db.users.update({"name":
"joe"},
...{"$unset":
{"favoritebook":
1}})
>db.blog.posts.findOne()
{
"_id":
ObjectId("4b253b067525f35f94b60a31"),
"title":
"ABlogPost",
"content":
"...",
"author":
{
"name":
"joe",
"email":
"joe@"
}
}
>db.blog.posts.update({"author.name":
"joe"},{"$set":
{"author.name":
"joeschmoe"}})
>db.blog.posts.findOne()
{
"_id":
ObjectId("4b253b067525f35f94b60a31"),
"title":
"ABlogPost",
"content":
"...",
"author":
{
"name":
"joeschmoe",
"email":
"joe@"
}
}
自增和消耗
>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":
"Ablogpost",
"content":
"..."
}
>db.blog.posts.update({"title":
"Ablogpost"},{$push:
{"comments":
...{"name":
"joe","email":
"joe@","content":
"nicepost."}}})
>db.blog.posts.findOne()
{
"_id":
ObjectId("4b2d75476cc613d5ee930164"),
"title":
"Ablogpost",
"content":
"...",
"comments":
[
{
"name":
"joe",
"email":
"joe@",
"content":
"nicepost."
}
]
}
再来一次
>db.blog.posts.update({"title":
"Ablogpost"},{$push:
{"comments":
...{"name":
"bob","email":
"bob@","content":
"goodpost."}}})
>db.blog.posts.findOne()
{
"_id":
ObjectId("4b2d75476cc613d5ee930164"),
"title":
"Ablogpost",
"content":
"...",
"comments":
[
{
"name":
"joe",
"email":
"joe@",
"content":
"nicepost."
},
{
"name":
"bob",
"email":
"bob@",
"content":
"goodpost."
}
]
}
$ne
>db.papers.update({"authorscited":
{"$ne":
"Richie"}},
...{$push:
{"authorscited":
"Richie"}})
$addToSet:
>db.users.findOne({"_id":
ObjectId("4b2d75476cc613d5ee930164")})
{
"_id":
ObjectId("4b2d75476cc613d5ee930164"),
"username":
"joe",
"emails":
[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mongodb 学习 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)