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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhdz_bj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值