1.简单说说
mongodb是文档型数据库
mongodb 存储的是Bson —>是json的二进制。
特点,内部执行引擎为js 解释器,把文档存储成 json 结构 ,在查询时转换成js对象,并且可以使用熟悉的js语法操作。
mongodb 与 mysql(关系型数据库)比较:
关系型数据库是结构化的数据,每一行的数据格式是固定的。
文档型数据库,每个文档都有自己独特的数据结构
grid fs:大文件管理。
2 .mongodb 的基本使用
- 启动mongodb数据库 mongod –config mongod.cfg
- 显示所有数据库 show dbs
- 使用指定的集合集 use collectionName (不需要特意创建数据库 他可以自动创建)
- 插入数据 db.collectionName .insert({name:’myName’,age:22}) 插入的文档是json的格式。
- 插入可以使用js语法 for(i=3;i<100;i++) dbs.collectionName .insert({x:i})
- 查询 db.collectionName .find() 参数可以为空 返回所有的信息 会默认创建一个id (——id 全局不能重复)
- 查询 db.collectionName .find().skip(3).limit(2).sort({x:1}),skip跳过多少的数据 limit限制查询出多杀数据 sort排序
- 更新 db.collectionName.update({x:1},{x:99}) 将1更新为 99
- 更新部分字段 db.collectionName .update({z:100},{$set:{y:99}}) 这样 z 与 x 的值不会改变 ,使用上一条的操作 z,x会被覆盖,消失掉。
- 更新不存在的数据时 自动创建 db.collectionName.update({x:1},{x:99},true)
- 多文档更新 默认多条数据相同 只会更新第一条0( 防止误操作才这样设计的)条件只允许使用 set操作db.collectionName.update({c:1},{$set:{c:2}},false,true),参数1为条件 参数2为改变的值 参数3位upset
- 删除数据 db.collectionName.remove({c:2}) 参数必传
- 删除集合集 (删除表) db.collectionName.drop()
3.索引
1.查看索引
db.collecation.genIndexes()
2._id 索引
也是默认创建的索引。插入指定的 _id db.collection.insert({ _id:1,name:’hello’}) 查询第一条db.collecion.findOne();
3.单建索引
db.collection.ensureIndex({x:1}) key 的代表方向,1为正向排序,-1为逆向排序 如果文档较多,负载较多, 不能直接使用这个命令创建,创建数据库时创建出来。
4.多键索引
与单建索引创建类似 。 db.collection.insert(x:[1,2,3,4,5]) 结合上面的操作 ,这时会创建出一个多建索引
5.复合索引
查询条件不只有一个时,就需要创建复合索引 插入{x:1,y:2,z:3}–>按照x,y查询 –>创建db.collection.ensureIndex({x:1,y:1}) –>find({x:1,y:2})
6.过期索引
适用于一段时间后失效的数据登录信息 存储日志。创建 db.collection.ensureIndex({time:1},{expireAfterSecondes:10}) 参数expireAfterSecondes单位为秒。参数time为时间类型,如果time是时间数组,会按照最小时间进行删除,因为不能有两个过期时间。过期索引不能试复合索引。删除时间是不精准的,mongodb后台有个60s跑一次的删除进程,而删除也需要时间,所以有误差。
7.全文索引:
对字符串与字符串数组创建全文可搜索的索引 使用场景{author:” ,titile:”,article:”}。每个数据集合只能创建一个全文索引
创建:
db.collection.ensureIndex({key:"text"})
db.collection.ensureIndex({key_1:"text",key_2:"text2"})
db.collection.ensureIndex({"$**":"text"})
查询:
db.collection.find({ \$ text:{\$search:"coffee"}})
db.collection.find({\$text:{\$search:"aa bb cc"}})
db.collection.find({\$text:{\$search:"aa bb -cc"}})
db.collection.find({\$text:{$search:" \ "aa " bb cc "}})
全文索引的相似度:
$meta操作符:{score:{$meta:"textScore"}},写在查询条件后面可以返回 返回结果的相似度 ,再通过sort一起使用,可以达到很好的效果。
全文索引的使用限制:
每次查询,只能指定一个$text查询
$text查询不能出现在$nor查询中
查询中如果包含了$test,hint不再起作用
8.索引属性
创建索引格式:
db.collection.ensureIndex({param},{param})
第一个参数是索引的值,其中第二个参数是索引的属性
**比较重要和常用的属性**
名字 唯一性 稀疏性 是否定时删除(过期索引)
自定义 名字 db.collection.ensureIndex({x:1,v:1,s:1},{name:"xvs_index"});
设置 唯一性 db.collection.ensureLndex({m:1,n:1},{unique:true})
稀疏性 db.collection.ensureIndex({v:1},{sparse:true})
假设 你创建了x 字段的索引,当你插入一条数据时,并不包含x字段, 默认情况下mongo也会 创建出x字段索引,避免这个种情况就可以使用稀疏索引设置为true。好处狠多,不必为没有使用的索引进行 创建,减少了不必要的磁盘占用空间。
9.地理位置索引
将一些点的位置存储,创建索引后可以根据位置来进行查找其他点。
(1.子分类:
2d索引,用于存储和查找平面上的点
2d sphere索引用于存储查找球面上的点
(2.查找方式:
1.查找距离某个点一定距离内的点
2.查找包含在某个区域内的点
2D索引:平面地理位置索引
创建方式:db.collection.ensureIndex({w:”2d”})
取值范围:经度[-180,180]纬度[-90,90]
db.location.ensureIndex({w:"2d"}) //创建索引
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
db.location.insert({w:[1,1]})
WriteResult({ "nInserted" : 1 })
db.location.insert({w:[1,2]})
WriteResult({ "nInserted" : 1 })
db.location.insert({w:[3,2]})
WriteResult({ "nInserted" : 1 })
db.location.insert({w:[100,100]})
WriteResult({ "nInserted" : 1 })
db.location.insert({w:[200,200]})//经度超出后会报错
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 13027,
"errmsg" : "point not in interval of [ -180, 180 ] :: caused by :: { _id: ObjectId('5b28a8dadb55746ceb317418'), w: [ 200.0, 200.0 ] }"
}
})
db.location.insert({w:[180,100]})//纬度超出后不会报错 要避免这种情况
WriteResult({ "nInserted" : 1 })
db.location.remove({w:[180,100]})
WriteResult({ "nRemoved" : 1 })
db.location.insert({w:[180,80]})
WriteResult({ "nInserted" : 1 })
db.location.find({w:{$near:[1,1]}}) $near查询出100个距离查询最近的点
{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }
{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }
{ "_id" : ObjectId("5b28a8cfdb55746ceb317417"), "w" : [ 100, 100 ] }
{ "_id" : ObjectId("5b28a91fdb55746ceb31741a"), "w" : [ 180, 80 ] }
db.location.find({w:{$near:[1,1],$maxDistance:10}})//使用$maxDistance 限制距离我最远的距离
{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }
{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`
查询方式:
1.$near查询:查询距离某个点最近的点
2.$geoWithin查询:查询某个形状内的点
形状的表示:
1.$box:矩形,使用 {$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }
{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`
2.$center:圆形,使用 {$center:[[<x1>,<y1>],r]}表示
db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})
{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }
{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`
3.$polygon:多边形,使用{$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})
{ "_id" : ObjectId("5b28a8b2db55746ceb317414"), "w" : [ 1, 1 ] }
{ "_id" : ObjectId("5b28a8b5db55746ceb317415"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("5b28a8bbdb55746ceb317416"), "w" : [ 3, 2 ] }`
使用$geonear查询:
geonear使用runCommand命令进行使用,如下
db.runCommand(
{
geoNear:<collection>, //集合名字
near:[x,y], //坐标
minDistance:(对2D索引无效)
maxDistance: //对2D有效
num: //返回条目
})
使用代码:
`
db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:1})
{
"results" : [
{
"dis" : 0,
"obj" : {
"_id" : ObjectId("5b28a8b5db55746ceb317415"),
"w" : [
1,
2
]
}
}
],
"stats" : {
"nscanned" : 3,
"objectsLoaded" : 1,
"avgDistance" : 0,
"maxDistance" : 0,
"time" : 0
},
"ok" : 1
}
db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:2})
{
"results" : [
{
"dis" : 0,
"obj" : {
"_id" : ObjectId("5b28a8b5db55746ceb317415"),
"w" : [
1,
2
]
}
},
{
"dis" : 1,
"obj" : {
"_id" : ObjectId("5b28a8b2db55746ceb317414"),
"w" : [
1,
1
]
}
}
],
"stats" : {
"nscanned" : 32,
"objectsLoaded" : 2,
"avgDistance" : 0.5,
"maxDistance" : 1,
"time" : 3
},
"ok" : 1
}
2dsphere 索引
概念:球面地理位置索引
创建方式:db.collection.ensureIndex({w:”2dphere”})
位置表示方式:
GeoJson:描述一个点,一个直线。多边形等形状。(交叉点什么的都行,就是不会)
格式:{type:”“,coordinates:[ < coordinates>]}
查询方式与2d索引查询类似。
支持$minDistance 与$maxDistance
索引构建情况分析
索引的好处:加快索引相关的查询
索引不好处:增加磁盘空间的消耗,降低写入性能
如何评判当前索引构建情况:
1.mongostat工具,查看mongodb运行状态的程序,使用:mongostat -h 127.0.0.1:27017
字段说明:索引情况:idx miss (没有使用索引)。。。(这个可以再找找其他的意思)
2.profile集合(使用场景测试阶段,刚上线时的试运行阶段)
设置profile级别为2,记录所有的操作。
db.setProfilingLevel(2)。
这是创建出一个 system.profile 文件 查询这个文件得到所有的操作信息。
db.system.profile.find() | db.system.profile.find(10).srot({$natural:-1})
$natural这个自然信息排序 根据-1 ,1分辨正向,逆向
3.日志
使用 verbose,日志详细程度,一个V到五个V不同,V越多,记录的越详细
4.explain分析
10索引总结
不同类型索引的创建和查询
如何评价当前系统的索引构建情况
如何优化mongodb的索引使用
全文索引的使用限制
4.mongodb 安全
1.最安全的是物理隔离 :不现实
2.网络隔离其次
3.防火墙再其次
4.用户名 密码 在最后
1095

被折叠的 条评论
为什么被折叠?



