MongoDB条件运算符

MongoDB 条件运算符详解与实战应用

一、比较运算符核心要点

  1. 基础比较运算符
    等于($eq)
    支持隐式写法{age: 33}或显式{age: {$eq: 33}},适用于精确匹配场景(如查询年龄为33的用户)
    范围运算符($lt/$lte/$gt/$gte)
    支持数值、日期等可比较类型,常用于区间过滤(如查询年龄>33且<35的用户)

    // 查询年龄在33-35岁之间的用户(包含33和35)
    db.users.find({age: {$gte: 33, $lte: 35}})
    
  2. 集合匹配运算符
    $in/$nin
    用于多值匹配或排除,比多次$or查询更高效(如筛选特定年龄段用户)

    // 查询年龄为32、33或34岁的用户
    db.users.find({age: {$in: [32,33,34]}})
    
  3. 字段存在性处理
    当文档缺少目标字段时,所有比较运算符默认过滤该文档。需结合$exists判断字段是否存在(如查询无年龄字段的用户)

    // 查询未填写年龄的用户(需显式判断)
    db.users.find({age: {$exists: false}})
    

二、逻辑运算符高级用法

  1. 逻辑组合操作
    隐式AND
    多个条件直接并列即表示AND关系(如同时满足年龄>33和子年龄<5)

    db.users.find({age: {$gt:33}, "child.age": {$lt:5}})
    

    显式$or
    需通过数组声明多个独立条件(如查询年龄为33或36的用户)

    db.users.find({$or: [{age:33}, {age:36}]})
    
  2. 复杂逻辑嵌套
    支持多层级AND/OR组合,需注意括号优先级(如复合班级和性别条件)

    // 查询(班级301且男生)或(班级302且女生)
    db.users.find({
      $or: [
        {$and: [{class:301}, {sex:true}]},
        {$and: [{class:302}, {sex:false}]}
      ]
    })
    
  3. 否定操作符$not
    用于反转条件逻辑,常与正则表达式结合使用(如排除特定格式用户名)

    // 查询用户名不以"lao"开头的用户
    db.users.find({name: {$not: /^lao/}})
    

三、实战注意事项

  1. 嵌套字段查询
    使用点号访问子文档字段(如查询子年龄小于5的用户)

    db.users.find({"child.age": {$lt:5}})
    
  2. 空值处理差异
    {age: {$ne:33}}会包含age=null的文档,需配合$exists精确过滤

    // 排除年龄为33且存在年龄字段的用户
    db.users.find({age: {$ne:33, $exists:true}})
    
  3. 性能优化建议
    • 优先使用$in代替多个$or条件
    • 对高频查询字段创建索引(如年龄字段索引)
    • 避免在$where中使用复杂JavaScript表达式

通过合理组合条件运算符,可实现从简单过滤到复杂业务逻辑的完整查询能力。建议结合explain()方法分析查询执行计划,持续优化性能。

posted @ 2025-03-26 21:30  千陌666  阅读(45)  评论(0)    收藏  举报