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