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":"呐喊,彷徨"
}