分类 代码分析 下的文章

mongodb如何实现group by查询

查询命令用到了mongodb的管道命令。

命令如下:

db.table.aggregate([{$group : {_id : "$field", num_tutorial : {$sum : 1}}}])

$field 表示按field字段进行分组。
$sum 表示计算总和,默认值为1。

如果还需要按总和倒叙排列,命令如下:

db.table.aggregate([{$group : {_id : "$field", num_tutorial : {$sum : 1}}}, {$sort : {num_tutorial : -1}}])

记一次mongodb查询的问题

问题描述

同样的代码,重复执行后就会出现查询超时的错误。
代码类似如下:

$start = file_get_contents('start.pid');
if (!$start) {
    $start = 0;
}

$conditions = array(
    'id' => array(
        '$gt' => $start,
    ),
);

$conn = new MongoClient('mongodb://127.0.0.1:27017');
$dataList = $conn->db->table->find($conditions)->limit(10);

foreach ($dataList as $data) {
    // 具体逻辑
}

问题排查

看了explain的信息,没发现任何问题,想到mongo有提供shell操作。

执行以下命令

db.table.find({"id":{"$gt":"12998"}}).limit(1)

// 输出为空

执行以下命令

db.table.find({"id":{"$gt":12998}}).limit(1)

// 输出查询结果

对比上面两个命令,发现区别在于条件里的类型。
事后查了下资料,发现mongodb的字段类型必须一致。

资料参考:
为什么mongodb的字段会有类型之分

记录安装PHP7 beta 和 PHP的mongodb扩展

2015年12月29日更新,PHP7正式版已经发布,也有PHP7可用的mongodb扩展了。

手动编译安装PHP7
手动编译PHP7的MongoDB扩展
PHP7下使用MongoDB API

下面的内容已过期,请参考上面的文章安装MongoDB的扩展。

服务器环境 Ubuntu 14.04 x64

安装PHP7

echo "deb http://repos.zend.com/zend-server/early-access/php7/repos ubuntu/" >> /etc/apt/sources.list

apt-get update && apt-get install php7-beta1

参考zend的文章 PHP 7 Builds - By Zend Technologies - The PHP Company

安装mongodb的PHP扩展

wget https://github.com/mongodb/mongo-php-driver/archive/1.6.10.tar.gz
tar zxvf 1.6.10.tar.gz
cd mongo-php-driver-1.6.10
/usr/local/php7/bin/phpize

执行phpize出现“Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.”的错误,执行下面的命令安装autoconf。

apt-get install autoconf

继续上面的编译工作

/usr/local/php7/bin/phpize
./configure --with-php-config=/usr/local/php7/bin/php-config
make

make出现一堆错误,搜索了下发现mongodb的PHP扩展暂时还不支持PHP7.
PHP-1438
PHPC-285

无奈只能安装PHP5.