首页->正文

mongodb使用注意事项汇总

2012-04-30 -Web开发 标签: php mysql

近期项目用到了mongodb,虽然之前做过一些简单测试,但毕竟不是实际开发,遇到一些“奇怪”的问题,总结下来供大家参考。

*变量类型的敏感
存储的类型必须和查询的类型一致。例如int类型的123,不可用字符串形式的"123",所以接收参数时要注意类型的转换。

*不存在字段使用后不提示出错
之前的MySQL查询一个不存在的字段,当然会返回字段不存在的提示,但mongodb不会,只会返回空集合。

*返回字段的限制,只能一次指定要取或者不取的字段(_id除外)如
可以这样
array(
     "name"=>1,
     "age"=>1,
     "_id"=>0,
)

但是不可以这样
array(
     "name"=>1,
     "age"=>0,
     "_id"=>0,
)

否则会提示“could not initialize cursor across all shards because : You cannot currently mix including and excluding fields. Contact us if this is an issue.”

*默认是会返回的_id字段的,并且是对象格式(如果未自己定义过_id的话)

* 存储的是mongdb的时间类型,要通过mongoDate类查询,如查询2012-01-31至2012-02-01的时间段
$condition['timestamp'] = array(
     '$gte' => new mongoDate(strtotime("2012-01-31")),
     '$lte' => new mongoDate(strtotime("2012-02-01")),
);


*返回文档(表)的大小 db.collection.dataSize()

*在分片上运行group命令操作,会提示 can't do command: group on sharded collection,(同样distinct也有key的数量限制)还是用mapreduce吧。

*mapreduce
map相当于记录的映射过程
reduce相当于记录的合并过程
举个实际的例子,例如实现SQL中类似的功能:计算多个字段的SUM: “select sum(a) as a_sum, sum(b) as b_sum from tableName where id=123”
map = 'function(){
     emit("SUM", {a_sum:this.a, b_sum:this.b});
}';
reduce = 'function(key, values){
     var result={a_sum:0, b_sum:0};
     values.forEach(function(value){
          result.a_sum += value.a_sum;
          result.b_sum += value.b_sum;
     });
     return result;
}';
query = '{id:123}';


由于reduce过程是多项数据合并相同key的过程,需要注意emit中第二个参数的数据格式务必和reduce的return值一致,这样才能保证数据正常的合并。
(但是在速度测试中发现这种功能的mapreduce还不如客户端全部把数据取出,在程序中相加来的快……)
http://kylebanker.com/blog/2009/12/mongodb-map-reduce-basics/

下一篇 通过curl实现远程文件下载

上一篇 一则MySQL更新慢的问题

相关文章

Ubuntu下编译安装PHP

使用curl_multi_init并发请求

php增加Last-Modified为何无效

用xhprof分析php代码

正则修饰符m和s用法

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com