一、MongoDB文档查询全解析
1.1 基础环境配置
MongoDB作为文档型数据库,其部署过程需重点关注数据目录权限配置。在Linux环境下建议通过配置文件实现参数化管理,典型配置如下:
# mongodb.conf 示例配置port=27017dbpath=/var/lib/mongodb/datalogpath=/var/log/mongodb/mongod.logmaxConns=2000storageEngine=wiredTiger
配置完成后需执行以下权限设置命令:
chmod 755 /var/lib/mongodb/datachmod 644 /var/log/mongodb/mongod.log
启动服务时建议采用systemd管理:
systemctl enable mongodsystemctl start mongod
1.2 核心查询操作
条件查询语法
// 查询age大于25的文档db.users.find({ age: { $gt: 25 } })// 多条件组合查询db.products.find({price: { $lt: 100 },category: "electronics",$or: [ { stock: { $gt: 0 } }, { discontinued: false } ]})
游标操作方法
| 方法 | 说明 | 示例 |
|---|---|---|
| count() | 获取匹配文档总数 | db.orders.find().count() |
| limit() | 限制返回文档数量 | db.logs.find().limit(100) |
| skip() | 跳过指定数量文档 | db.articles.find().skip(20) |
| sort() | 排序结果集 | db.employees.find().sort({ salary: -1 }) |
文档更新策略
// 字段更新(原子操作)db.accounts.updateOne({ userId: "U1001" },{ $set: { balance: 1500, lastUpdate: new Date() } })// 数组操作db.inventory.updateOne({ sku: "abc123" },{ $push: { tags: "new-arrival" } })
1.3 性能优化建议
- 索引策略:为高频查询字段创建复合索引,注意索引选择性原则
- 查询分析:使用explain()方法分析查询执行计划
- 分页优化:避免大偏移量skip,改用基于游标的分页方案
- 读写分离:配置replica set实现自动故障转移和读扩展
二、Redis键值查询实践
2.1 数据结构选择指南
| 数据结构 | 适用场景 | 查询复杂度 |
|---|---|---|
| String | 简单键值存储 | O(1) |
| Hash | 对象属性存储 | O(1) |
| Sorted Set | 排行榜、范围查询 | O(logN) |
| Bitmap | 用户签到、状态标记 | O(1) |
2.2 高级查询模式
哈希表操作示例
# 存储用户信息HSET user:1001 name "Alice" age 28 email "alice@example.com"# 批量获取字段HMGET user:1001 name age# 条件查询(需Lua脚本实现)EVAL "local email=redis.call('HGET',KEYS[1],'email'); if email==ARGV[1] then return 1 else return 0 end" 1 user:1001 "alice@example.com"
有序集合范围查询
# 添加排行榜数据ZADD leaderboard 950 "userA" 870 "userB" 920 "userC"# 获取前3名ZREVRANGE leaderboard 0 2 WITHSCORES# 查询分数区间ZCOUNT leaderboard 900 1000
2.3 性能调优要点
- 管道技术:使用pipeline批量执行命令减少网络往返
- 连接池:配置合理的连接池参数(maxactive/maxidle)
- 数据分片:对于大key采用hash tag实现精准分片
- 内存管理:设置maxmemory策略(如volatile-lru)
三、Elasticsearch全文检索实战
3.1 查询DSL详解
基础匹配查询
GET /products/_search{"query": {"match": {"description": "wireless headphones"}}}
复合查询示例
GET /articles/_search{"query": {"bool": {"must": [{ "match": { "title": "database" } }],"filter": [{ "range": { "publish_date": { "gte": "2023-01-01" } } }],"should": [{ "match": { "author": "Smith" } }],"minimum_should_match": 1}}}
3.2 聚合分析应用
基础指标计算
GET /sales/_search{"size": 0,"aggs": {"total_sales": { "sum": { "field": "amount" } },"avg_price": { "avg": { "field": "price" } }}}
分组统计
GET /logs/_search{"size": 0,"aggs": {"by_level": {"terms": { "field": "severity.keyword" },"aggs": {"avg_duration": { "avg": { "field": "processing_time" } }}}}}
3.3 索引优化策略
-
映射设计:
- 合理设置field data类型
- 对需要精确匹配的字段使用keyword类型
- 禁用不需要搜索的字段的_source
-
分片策略:
- 单分片大小控制在30-50GB
- 根据节点数量计算最佳分片数(primary+replica)
-
查询优化:
- 使用filter context替代query context
- 避免前缀通配符查询(如
*term) - 对大结果集使用scroll API
四、多数据库协同方案
4.1 典型应用场景
| 场景 | 推荐方案 | 技术要点 |
|---|---|---|
| 实时排行榜 | Redis Sorted Set | ZADD/ZREVRANGE命令 |
| 用户行为分析 | Elasticsearch | 日志收集+聚合分析 |
| 社交关系存储 | MongoDB | 嵌套文档+图查询扩展 |
| 缓存层 | Redis | 多级缓存策略 |
4.2 数据同步方案
-
变更数据捕获(CDC):
- 通过MongoDB oplog实现实时同步
- 使用Debezium等开源工具
-
批量导入:
- Elasticsearch的Bulk API
- MongoDB的mongoimport工具
-
双写机制:
- 应用层实现最终一致性
- 使用消息队列解耦写入操作
4.3 监控告警体系
-
基础指标监控:
- 查询延迟(P99/P95)
- 连接数/QPS
- 内存使用率
-
告警策略:
- 慢查询告警(超过500ms)
- 连接池耗尽告警
- 存储空间不足预警
-
可视化方案:
- Grafana+Prometheus监控栈
- 云服务商提供的日志服务
本文系统阐述了三种主流非关系型数据库的查询技术,从基础配置到高级查询,从单机优化到集群方案,为开发者提供了完整的技术参考。实际开发中应根据业务特点选择合适的数据库组合,通过合理的架构设计实现性能与成本的平衡。建议开发者持续关注各数据库的版本更新,及时采用新特性优化现有方案。