MongoDB、Redis与Elasticsearch查询文档实践指南

一、MongoDB文档查询全解析

1.1 基础环境配置

MongoDB作为文档型数据库,其部署过程需重点关注数据目录权限配置。在Linux环境下建议通过配置文件实现参数化管理,典型配置如下:

  1. # mongodb.conf 示例配置
  2. port=27017
  3. dbpath=/var/lib/mongodb/data
  4. logpath=/var/log/mongodb/mongod.log
  5. maxConns=2000
  6. storageEngine=wiredTiger

配置完成后需执行以下权限设置命令:

  1. chmod 755 /var/lib/mongodb/data
  2. chmod 644 /var/log/mongodb/mongod.log

启动服务时建议采用systemd管理:

  1. systemctl enable mongod
  2. systemctl start mongod

1.2 核心查询操作

条件查询语法

  1. // 查询age大于25的文档
  2. db.users.find({ age: { $gt: 25 } })
  3. // 多条件组合查询
  4. db.products.find({
  5. price: { $lt: 100 },
  6. category: "electronics",
  7. $or: [ { stock: { $gt: 0 } }, { discontinued: false } ]
  8. })

游标操作方法

方法 说明 示例
count() 获取匹配文档总数 db.orders.find().count()
limit() 限制返回文档数量 db.logs.find().limit(100)
skip() 跳过指定数量文档 db.articles.find().skip(20)
sort() 排序结果集 db.employees.find().sort({ salary: -1 })

文档更新策略

  1. // 字段更新(原子操作)
  2. db.accounts.updateOne(
  3. { userId: "U1001" },
  4. { $set: { balance: 1500, lastUpdate: new Date() } }
  5. )
  6. // 数组操作
  7. db.inventory.updateOne(
  8. { sku: "abc123" },
  9. { $push: { tags: "new-arrival" } }
  10. )

1.3 性能优化建议

  1. 索引策略:为高频查询字段创建复合索引,注意索引选择性原则
  2. 查询分析:使用explain()方法分析查询执行计划
  3. 分页优化:避免大偏移量skip,改用基于游标的分页方案
  4. 读写分离:配置replica set实现自动故障转移和读扩展

二、Redis键值查询实践

2.1 数据结构选择指南

数据结构 适用场景 查询复杂度
String 简单键值存储 O(1)
Hash 对象属性存储 O(1)
Sorted Set 排行榜、范围查询 O(logN)
Bitmap 用户签到、状态标记 O(1)

2.2 高级查询模式

哈希表操作示例

  1. # 存储用户信息
  2. HSET user:1001 name "Alice" age 28 email "alice@example.com"
  3. # 批量获取字段
  4. HMGET user:1001 name age
  5. # 条件查询(需Lua脚本实现)
  6. 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"

有序集合范围查询

  1. # 添加排行榜数据
  2. ZADD leaderboard 950 "userA" 870 "userB" 920 "userC"
  3. # 获取前3名
  4. ZREVRANGE leaderboard 0 2 WITHSCORES
  5. # 查询分数区间
  6. ZCOUNT leaderboard 900 1000

2.3 性能调优要点

  1. 管道技术:使用pipeline批量执行命令减少网络往返
  2. 连接池:配置合理的连接池参数(maxactive/maxidle)
  3. 数据分片:对于大key采用hash tag实现精准分片
  4. 内存管理:设置maxmemory策略(如volatile-lru)

三、Elasticsearch全文检索实战

3.1 查询DSL详解

基础匹配查询

  1. GET /products/_search
  2. {
  3. "query": {
  4. "match": {
  5. "description": "wireless headphones"
  6. }
  7. }
  8. }

复合查询示例

  1. GET /articles/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. { "match": { "title": "database" } }
  7. ],
  8. "filter": [
  9. { "range": { "publish_date": { "gte": "2023-01-01" } } }
  10. ],
  11. "should": [
  12. { "match": { "author": "Smith" } }
  13. ],
  14. "minimum_should_match": 1
  15. }
  16. }
  17. }

3.2 聚合分析应用

基础指标计算

  1. GET /sales/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "total_sales": { "sum": { "field": "amount" } },
  6. "avg_price": { "avg": { "field": "price" } }
  7. }
  8. }

分组统计

  1. GET /logs/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "by_level": {
  6. "terms": { "field": "severity.keyword" },
  7. "aggs": {
  8. "avg_duration": { "avg": { "field": "processing_time" } }
  9. }
  10. }
  11. }
  12. }

3.3 索引优化策略

  1. 映射设计

    • 合理设置field data类型
    • 对需要精确匹配的字段使用keyword类型
    • 禁用不需要搜索的字段的_source
  2. 分片策略

    • 单分片大小控制在30-50GB
    • 根据节点数量计算最佳分片数(primary+replica)
  3. 查询优化

    • 使用filter context替代query context
    • 避免前缀通配符查询(如*term
    • 对大结果集使用scroll API

四、多数据库协同方案

4.1 典型应用场景

场景 推荐方案 技术要点
实时排行榜 Redis Sorted Set ZADD/ZREVRANGE命令
用户行为分析 Elasticsearch 日志收集+聚合分析
社交关系存储 MongoDB 嵌套文档+图查询扩展
缓存层 Redis 多级缓存策略

4.2 数据同步方案

  1. 变更数据捕获(CDC)

    • 通过MongoDB oplog实现实时同步
    • 使用Debezium等开源工具
  2. 批量导入

    • Elasticsearch的Bulk API
    • MongoDB的mongoimport工具
  3. 双写机制

    • 应用层实现最终一致性
    • 使用消息队列解耦写入操作

4.3 监控告警体系

  1. 基础指标监控

    • 查询延迟(P99/P95)
    • 连接数/QPS
    • 内存使用率
  2. 告警策略

    • 慢查询告警(超过500ms)
    • 连接池耗尽告警
    • 存储空间不足预警
  3. 可视化方案

    • Grafana+Prometheus监控栈
    • 云服务商提供的日志服务

本文系统阐述了三种主流非关系型数据库的查询技术,从基础配置到高级查询,从单机优化到集群方案,为开发者提供了完整的技术参考。实际开发中应根据业务特点选择合适的数据库组合,通过合理的架构设计实现性能与成本的平衡。建议开发者持续关注各数据库的版本更新,及时采用新特性优化现有方案。