PHP连接MongoDB实现数据查询的常用操作指南

咖啡半糖
咖啡半糖
发布时间:2026-10-14 | 3人浏览过
原创

在使用PHP开发时,如何高效地使用MongoDB数据库进行数据查询是常见的技术需求。本文将系统梳理PHP对接MongoDB后常用的SELECT类操作,包括基础的数量统计、精确查询、指定列输出、复杂条件过滤以及高级的分页与排序功能。

1. 获取集合记录数

查询数据量是统计分析的基础。在MongoDB shell中可以通过 count() 方法直接获取,在PHP中也支持对结果集调用该方法。

  1. 统计所有记录:使用 $collection->count()。
  2. 带条件的统计:将查询条件以数组形式传入,如统计某作者的数据量 $collection->count(['auther' => '李白'])。
  3. 复合条件统计:结合范围查询,例如统计金额在40至60之间的书籍数量:
    // MongoDB Shell: db.books.count({money:{$gt:40,$lte:60}})
    $count = $collection->find(['money' => ['$gt' => 40, '$lte' => 60]])->count();
    // 或者直接:
    $count = $collection->count(['money' => ['$gt' => 40, '$lte' => 60]]);
    

提示:理解以下比较运算符有助于构建条件:
$gt (大于) | $gte (大于等于) | $lt (小于) | $lte (小于等于) | $ne (不等于)

2. 获取单条或多条数据

获取单条记录:
当只需要符合条件的第一条数据时,使用 findOne()。如果没有提供参数,它将返回集合中的第一条文档。

// 查找作者为李白的任意一条记录
$result = $collection->findOne(['auther' => '李白']);

3. 游标快照处理 (Snapshot)

MongoDB的默认查询结果是一个动态游标。如果在查询执行期间有其他进程插入了符合新条件的记录,当前游标可能会包含这些新数据。若业务要求严格锁定当前快照,可以调用 snapshot()。

// 开启快照,确保遍历期间不受到并发插入的影响
$result = $collection->find(['auther' => '李白'])->snapshot();
foreach ($result as $id => $value) {
    var_dump($value);
}

4. 自定义显示字段 (Projection)

为了减少网络传输和内存占用,通常只需展示部分字段。在PHP中通过 fields() 方法定义哪些列显示(true)或不显示(false)。

// 1. 排除法:不显示 auther 和 money 列
$result = $collection->find()->fields(['auther' => false, 'money' => false]);

// 2. 显示法:只显示 title 列(此时 _id 字段依然会自动显示)
$result = $collection->find()->fields(['title' => true]);

// 3. 结合条件过滤并只取两列:筛选金额在60-100之间且必须存在 typeColumn 的记录
$where = [
    'typeColumn' => ['$exists' => true],
    'money' => ['$exists' => true, '$gte' => 60, '$lte' => 100]
];
$result = $collection->find($where)->fields(['typeColumn' => true, 'money' => true]);

5. 分页查询

类似于MySQL的 LIMIT/OFFSET,MongoDB使用 skip() 和 limit() 实现分页。链式调用的顺序不影响最终结果,但建议先 skip 再 limit。

// 跳过前1条记录,取第2条数据
$result = $collection->find()->skip(1)->limit(1);

6. 多字段排序

在需要多层级排序时使用 sort()。参数为1表示升序,为-1表示降序。前面的排序字段优先级更高。

// 优先按 code 升序排列,code相同时按 money 降序排列
$result = $collection->find()->sort(['code' => 1, 'money' => -1]);

7. 模糊查询 (Regex)

使用正则表达式进行文本匹配。在PHP中需要使用 MongoRegex 对象来封装正则字符串。

  • 包含匹配 (Like '%...%'):标题中包含“城”字的记录。
    $param = ['title' => new MongoRegex('/城/')];
    $result = $collection->find($param);
    
  • 前缀匹配 (Like '...%'):作者名字以“李”开头的记录。
    $param = ['auther' => new MongoRegex('/^李/')];
    $result = $collection->find($param);
    
  • 后缀匹配 (Like '%...'):作者名字以“书”结尾的记录。
    $param = ['auther' => new MongoRegex('/书$/')];
    $result = $collection->find($param);
    

8. 集合内匹配 ($in 和 $nin)

用于匹配数组字段或在一个指定列表中进行多选查询。

// 查找 money 值存在于 [20, 30, 90] 集合中的数据
$param = ['money' => ['$in' => [20, 30, 90]]];
$result = $collection->find($param);

// 复杂的 $in 查询:作者以“李”或“钱”开头
$param = ['auther' => ['$in' => [new MongoRegex('/^李/'), new MongoRegex('/^钱/')]]];
$result = $collection->find($param);

9. 逻辑或查询 ($or)

当满足任一条件即可被查出时,使用 $or。注意其数组结构的嵌套层级。

// 查找 money 为 20 或者 money 为 80 的数据
$param = ['$or' => [['money' => 20], ['money' => 80]]];
$result = $collection->find($param);
foreach ($result as $item) {
    var_dump($item);
}

10. 去重查询 (distinct)

提取某一列的去重值。这通常需要配合 command() 发起底层命令。

// 1. 获取所有不重复的作者名
$result = $curDB->command(['distinct' => 'books', 'key' => 'auther']);

// 2. 带有过滤条件的去重:获取金额大于60的不重复作者
$where = ['money' => ['$gte' => 60]];
$result = $curDB->command([
    'distinct' => 'books', 
    'key' => 'auther', 
    'query' => $where
]);

以上就是PHP中操作MongoDB数据库实现常用查询的代码详解,更多关于PHP后端开发与NoSQL数据库优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表