赞
踩
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
MongoDB中聚合(aggregate)主要⽤于统计数据(诸如统计平均值,求和等),并返回计算后的数据结果。
表达式 描述
$sum 计算总和
$avg 计算平均值
$min 获取集合中所有⽂档对应值得最⼩值
$max 获取集合中所有⽂档对应值得最⼤值
$push 在结果⽂档中插⼊值到⼀个数组中
$addToSet 在结果⽂档中插⼊值到⼀个数组中,但数据不重复
$first 根据资源⽂档的排序获取第⼀个⽂档数据
$last 根据资源⽂档的排序获取最后⼀个⽂档数据
MongoDB 中使⽤ db.COLLECTION_NAME.aggregate([{},…]) ⽅法来构建和使⽤聚合管道,每个⽂档通过⼀
个由⼀个或者多个阶段(stage)组成的管道,经过⼀系列的处理,输出相应的结果。
MongoDB的聚合管道将MongoDB⽂档在⼀个管道处理完毕后将结果传递给下⼀个管道处理。管道操作是可以重复
的。
这⾥我们介绍⼀下聚合框架中常⽤的⼏个操作:
db.lg_resume_preview.aggregate(
[{$group : {_id: "$city", avgSal:{$avg:"$expectSalary"}}},
{$project : {city: "$city", salary : "$avgSal"}}
])
db.lg_resume_preview.aggregate(
[{$group:{_id: "$city",count:{$sum : 1}}},
{$match:{count:{$gt:1}}}
])
介绍:Pipeline查询速度快于MapReduce,但是MapReduce的强⼤之处在于能够在多台Server上并⾏执⾏复杂的聚合逻辑。MongoDB不允许Pipeline的单个聚合操作占⽤过多的系统内存,如果⼀个聚合操作消耗20%以上的内存,那
么MongoDB直接停⽌操作,并向客户端输出错误消息。
MapReduce是⼀种计算模型,简单的说就是将⼤批量的⼯作(数据)分解(MAP)执⾏,然后再将结果合并成最终结果(REDUCE)
>db.collection.mapReduce(
function() {emit(key,value);}, //map 函数
function(key,values) {return reduceFunction}, //reduce 函数
{
out: collection,
query: document,
sort: document,
limit: number,
finalize: <function>,
verbose: <boolean>
}
)
使⽤ MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调⽤ emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进⾏处理。
db.lg_resume_preview.mapReduce(
function() { emit(this.city,this.expectSalary); },
function(key, value) {return Array.avg(value)},
{
query:{expectSalary:{$gt: 15000}},
out:"cityAvgSal"
}
)
介绍:索引⽬标是提⾼数据库的查询效率,没有索引的话,查询会进⾏全表扫描(scan every document in a collection),数据量⼤时严重降低了查询效率。默认情况下Mongo在⼀个集合(collection)创建时,⾃动地对集合的_id创建了唯⼀索引。
对于单个字段索引,索引键的排序顺序⽆关紧要,因为MongoDB可以在任⼀⽅向读取索引。
对于单个字段索引,索引键的排序顺序⽆关紧要,因为MongoDB可以在任⼀⽅向读取索引。 1 正序 0 倒叙
create:
db.集合名.createIndex({"字段名":排序⽅式})
db.集合名.createIndex({"⽇期字段":排序⽅式}, {expireAfterSeconds: 秒数})
通常我们需要在多个字段的基础上搜索表/集合,这是⾮常频繁的。 如果是这种情况,我们可能会考虑在MongoDB中制作复合索引。 复合索引⽀持基于多个字段的索引,这扩展了索引的概念并将它们扩展到索引中的更⼤域。 制作复合索引时要注意的重要事项包括:字段顺序与索引⽅向。
db.集合名.createIndex( { "字段名1" : 排序⽅式, "字段名2" : 排序⽅式 } )
针对地理空间坐标数据创建索引。
db.company.insert( { loc : { type: "Point", coordinates: [ 116.482451, 39.914176 ] }, name: "⼤望路地铁", category : "Parks" } ) db.company.ensureIndex( { loc : "2dsphere" } ) 参数不是1或-1,为2dsphere 或者 2d。还可以建⽴组合索引。 db.company.find({ "loc" : { "$geoWithin" : { "$center":[[116.482451,39.914176],0.05] } } })
MongoDB提供了针对string内容的⽂本查询,Text Index⽀持任意属性值为string或string数组元素的索引查询。
db.集合.createIndex({"字段": "text"})
db.集合.find({"$text": {"$search": "coffee"}})
针对属性的哈希值进⾏索引查询,当要使⽤Hashed index时,MongoDB能够⾃动的计算hash值,⽆需程序计算hash值。注:hash index仅⽀持等于查询,不⽀持范围查询。
db.集合.createIndex({"字段": "hashed"})
创建索引并在后台运⾏ db.COLLECTION_NAME.createIndex({"字段":排序⽅式}, {background: true}); 获取针对某个集合的索引 db.COLLECTION_NAME.getIndexes() 索引的⼤⼩ db.COLLECTION_NAME.totalIndexSize() 索引的重建 db.COLLECTION_NAME.reIndex() 索引的删除 db.COLLECTION_NAME.dropIndex("INDEX-NAME") db.COLLECTION_NAME.dropIndexes() 注意: _id 对应的索引是删除不了的
explain()也接收不同的参数,通过设置不同参数我们可以查看更详细的查询计划。
B+树
B+ 树的特点:
(1) 多路⾮⼆叉
(2) 只有叶⼦节点保存数据
(3) 搜索时 也相当于⼆分查找
(4) 增加了 相邻节点指针
从上⾯我们可以看出最核⼼的区别主要有俩,⼀个是数据的保存位置,⼀个是相邻节点的指向。就是这俩造成了
MongoDB和MySql的差别。
● ⽹站数据:Mongo ⾮常适合实时的插⼊,更新与查询,并具备⽹站实时数据存储所需的复制及⾼度伸缩性。
● 缓存:由于性能很⾼,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。
● ⼤尺⼨、低价值的数据:使⽤传统的关系型数据库存储⼀些⼤尺⼨低价值数据时会⽐较浪费,在此之前,很多时候程序员往往会选择传统的⽂件进⾏存储。
● ⾼伸缩性的场景:Mongo ⾮常适合由数⼗或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置⽀持以及集群⾼可⽤的解决⽅案。
● ⽤于对象及JSON 数据的存储:Mongo 的BSON 数据格式⾮常适合⽂档化格式的存储及查询。
内嵌: 内嵌的⽅式指的是把相关联的数据保存在同⼀个⽂档结构之中。MongoDB的⽂档结构允许⼀个字段或者⼀个数组内的值作为⼀个嵌套的⽂档。
例如: 用户的个人信息中嵌入订单相关的集合。等等,要避免过多的重复数据嵌入,造成空间的浪费和查询速度的降低。
引⽤: 引⽤⽅式通过存储数据引⽤信息来实现两个不同⽂档之间的关联,应⽤程序可以通过解析这些数据引⽤来访问相关数据。
选择内嵌:
选择引⽤:
1.⽂档空间分配⽅式
WiredTiger使⽤的是BTree存储 MMAPV1 线性存储 需要Padding
2.并发级别
WiredTiger ⽂档级别锁 MMAPV1引擎使⽤表级锁
3.数据压缩
snappy (默认) 和 zlib ,相⽐MMAPV1(⽆压缩) 空间节省数倍。
4.内存使⽤
WiredTiger 可以指定内存的使⽤⼤⼩。
5.Cache使⽤
WT引擎使⽤了⼆阶缓存WiredTiger Cache, File System Cache来保证Disk上的数据的最终⼀致性。
⽽MMAPv1 只有journal ⽇志。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。