Mongodb高级特性
1.capped collection(固定大小集合): 创建时指定集合大小, 空间用完后, 新加对象会替代集合中最旧的对象 (); 更新超出集合大小将失败; 通过 drop() 方法删除集合所有行.
1) 创建
-- 创建 capped collection:col1, 指定该集合为 capped, 大小为 2m, 最多存储 100 个文档, 并通过指定 "autoIndexId" 参数在 "_id" 字段上自动创建索引, 该参数创建普通集合时默认为 "true",
-- 但对 capped collection 默认为 "false"
> db.createCollection("col1",{capped:true,size:2048,max:100,autoIndexId:true});
-- 检测集合是否为 capped collecton, 返回 true 为 capped collection,false 为非 capped collection.
> db.col1.isCapped();
-- 检查 capped collection 空间使用
> db.col1.validate();
-- 将普通集合转换为 capped collection, 且设定 capped collection 为 1024 字节大小.
> db.runCommand({"convertToCapped":"col1",size:1024});
2) 适用场景
-- 主要用于循环利用的场景, 例如: 数据库日志. 当写多读少时, 最好不建索引, 否则, 最好建索引.
2.GridFS
1)GridFS 为将大型文件存储于 Mongdb 中的一种文件规范, 所有官方驱动均对其提供支持. 此外,GridFS 支持 Java,Perl,PHP,Python,Ruby 等编程语言, 且提供相应接口.
2)Mongodb 对 BSON 对象的大小有限制, 因此,GridFS 为其提供了一种透明机制, 其可将大文件分割为较小文档, 这样, 实现了类似视频和高质量图片等巨大文件的存储.
3)mongofiles 命令: 从命令行操作 GridFS 的工具.
-- 将 testfile 文件存入 mongodb 中
# ./mongofiles put testfile
-- 查看 mongodb 库中的 GridFS 文件
# ./mongofiles list
-- 登录 mongodb 库查看
# ./mongo
> show collections
> db.fs.files.find()
> db.fs.chunks.find()
-- 将 testfile 从库中取出
# rm -rf tesfile
# ./mongofiles get testfile
# md5sum testfile
-- 为 GridFS 创建索引
> db.fs.chunks.ensureIndex({files_id:1,n:1},{unique:true});
-- 获取第一个 chunk
> db.fs.chunks.findone({file_id:myFileID,n:0});
3.MapReduce 模型
--MapReduce 为一种计算模型, 其功能类似关系库的 group by, 但其可以将大量工作分解成多个小任务, 并将其放置多个服务器上并行处理. 其中,Map 完成任务的分解,Reduce 完成数据
-- 的聚合.
1)MapReduce
-- 语法
> db.collection.mapReduce(
function(){emit(key,value);},
function(key,values) {return reduceFunction},
{
out: collection,
query: document,
sort: document,
limit: number
}
)
-- 注:
1)map: 映射函数 ( 生成键值对序列, 作为 reduce 函数的参数).
2)reduce: 统计函数,reduce 的任务是将一组键值对汇聚成单个键值对.
3)out: 将统计结果存放置集合 ( 如未指定, 则使用临时集合, 客户端断开后将自动删除).
4)query: 筛选条件, 只有满足条件的文档才会调用 map 函数.
5)sort: 将文档发往 map 函数前进行排序.
6)limit: 限定发往 map 函数的文档数量上限 ( 一般和 sort 搭配使用,query,sort 和 limit 可以任意组合使用).
-- 实例
-- 统计每个作者已发行作品的数量
> db.books.mapReduce(
function(){ emit(this.author,1); },
function(key,values) {return Array.sum(values)},
{
query:{status:"release"},
out:"books_total"
}
)
-- 输出结果
{
"result" : "books_total",
"timeMillis" : 11,
"counts" : {
"input" : 10,
"emit" : 10,
"reduce" : 1,
"output" : 2
},
"ok" : 1
}
> db.books_total.find()
-- 注
1)result: 存储结果的集合名字.
2)timeMillis: 运行花费的时间, 单位为 ms.
3)input: 被发送到 map 的, 满足条件的文档个数.
4)emit:map 函数中 emit 被调用的次数, 等于集合中的文档总数.
5)reduce:reduce 函数被调用的次数.
6)ouput: 结果集合中的文档个数.
7)ok: 是否成功, 成功为 1.
8)err: 如果失败, 为失败原因.
2)runCommand 命令
-- 也可以用 runCommand 命令运行 MapReduce
-- 语法:
db.runCommand({
mapreduce:<collection>,
map:<mapfunction>,
reduce:<reducefunction>,
[,query:<query filter object>]
[,sort:<sorts the input objects using this key.Useful for optimization,like sorting by the emit key for fewer reduces>]
[,limit:<number of objects to return from collection>]
[,out:<see output options below>]
[,keeptemp:<true|false>]
[,finalize:<finalizefunction>]
[,scope:<object where fields go into javascript global scope>]
[, jsMode : boolean,default true]
[,verbose:true]
});
-- 注
1)mapReduce: 要操作的集合.
2)map:map 函数.
3)reduce:reduce 函数.
4)finalize: 最终处理函数.
5)out: 输出结果的集合.
6)query: 对送往 map 函数的文档进行过滤.
7)sort: 对送往 map 函数的文档进行排序.
8)limit: 限定发往 map 函数的文档数量上限.
9)scope: 将外部变量导入 map,reduce,finalize.
10)jsMode: 是否将 map 执行的中间数据由 javascript 对象转换成 BSON 对象, 默认为 false.
11)verbose: 否显示详细的时间统计信息.
12)bypassDocumentValidation: 是否绕过文档验证.
13)collation: 其他一些校对.
-- 实例
> var m=function(){emit(this.author,this.book)}
> var r=function(key,value){return value.join(',')}
> db.runCommand({mapreduce:'books',m,r,out:"author_books",limit:3,verbose:true})
> db.author_books.find()
{
"_id":"......",
"author":"曹雪芹",
"books":"红楼梦"
}
{
"_id":".....",
"author":"鲁迅",
"books":"呐喊, 彷徨"
}