PHP连接MongoDB实现数据查询的常用操作指南
在使用PHP开发时,如何高效地使用MongoDB数据库进行数据查询是常见的技术需求。本文将系统梳理PHP对接MongoDB后常用的SELECT类操作,包括基础的数量统计、精确查询、指定列输出、复杂条件过滤以及高级的分页与排序功能。
1. 获取集合记录数
查询数据量是统计分析的基础。在MongoDB shell中可以通过 count() 方法直接获取,在PHP中也支持对结果集调用该方法。
- 统计所有记录:使用
$collection->count()。 - 带条件的统计:将查询条件以数组形式传入,如统计某作者的数据量
$collection->count(['auther' => '李白'])。 - 复合条件统计:结合范围查询,例如统计金额在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数据库优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













