查询数据

一、关系运算(比较运算符)

用于对字段值进行大小比较

 1// 等于(隐式)
 2{ age: 25 } 
 3
 4// 显式等于(严格匹配类型)
 5{ age: { $eq: 25 } }
 6
 7// 不等于
 8{ age: { $ne: 25 } }
 9
10// 大于
11{ age: { $gt: 18 } }
12
13// 大于等于
14{ age: { $gte: 20 } }
15
16// 小于
17{ age: { $lt: 30 } }
18
19// 小于等于
20{ age: { $lte: 30 } }
21
22// 范围查询(18 < age <= 30)
23{ age: { $gt: 18, $lte: 30 } }
24
25// 包含在数组中(类似 SQL IN)
26{ status: { $in: ["active", "pending"] } }
27
28// 不包含在数组中(类似 SQL NOT IN)
29{ status: { $nin: ["archived"] } }
  1. $gt:是 greater than 的缩写,表示“大于”。
  2. $lt:是 less than 的缩写,表示“小于”。
  3. $gte:是 greater than or equal to 的缩写,表示“大于等于”。
  4. $lte:是 less than or equal to 的缩写,表示“小于等于”。
  5. $eq:是 equal to 的缩写,表示“等于”。
  6. $ne:是 not equal to 的缩写,表示“不等于”。

二、逻辑运算(组合条件)

用于组合多个查询条件

1. 显式逻辑运算符

 1// AND 组合(多个条件同时满足)
 2{ 
 3  $and: [
 4    { age: { $gt: 18 } },
 5    { role: "user" }
 6  ] 
 7}
 8
 9// OR 组合(满足任意条件)
10{ 
11  $or: [
12    { status: "active" },
13    { score: { $gte: 90 } }
14  ] 
15}
16
17// NOT 取反(排除符合条件的结果)
18{ 
19  age: { $not: { $lt: 18 } } // 年龄不小于18
20}
21
22// NOR(所有条件都不满足)
23{ 
24  $nor: [
25    { role: "admin" },
26    { isDeleted: true }
27  ] 
28}

2. 隐式 AND

1// 逗号分隔的多个条件默认为 AND 关系
2{ 
3  age: { $gt: 18 }, 
4  role: "user" 
5}

三、字符串查询(模糊匹配与正则)

1. 精确匹配

1// 完全匹配字符串(区分大小写)
2{ name: "John Doe" }

2. 正则表达式匹配

 1// 基础正则(区分大小写)
 2{ name: /^john/ } // 以 "john" 开头
 3
 4// 使用 $regex 操作符(支持变量动态拼接)
 5const searchTerm = "doe";
 6{ 
 7  name: { 
 8    $regex: `^${searchTerm}`, 
 9    $options: "i" // 不区分大小写
10  } 
11}
12
13// 常用正则模式
14{ name: /john/i }          // 包含 "john"(不区分大小写)
15{ email: /\.com$/ }        // 以 ".com" 结尾
16{ description: /\bmongo\b/ } // 包含完整单词 "mongo"

3. 正则选项说明

在 MongoDB 中,$options 是用于正则表达式查询的选项参数,通常与 $regex 操作符一起使用,用于修改正则表达式的行为。

$options 的可选值包括:

  1. i:不区分大小写,允许匹配大小写不同的字符。
  2. m:多行模式,允许正则表达式中的锚点(如 ^$)在多行字符串中分别匹配每一行的开头和结尾。
  3. x:扩展模式,忽略正则表达式中的空白字符和注释(以 # 开头),方便编写复杂的正则表达式。
  4. s:允许点字符(.)匹配所有字符,包括换行符。

示例

以下是一些使用 $options 的示例:

  • 不区分大小写的匹配
    1db.collection.find({ field: { $regex: /pattern/, $options: 'i' } });
  • 多行匹配
    1db.collection.find({ field: { $regex: /^pattern$/, $options: 'm' } });
  • 忽略空白和注释的复杂正则
    1db.collection.find({ field: { $regex: /pattern/x, $options: 'x' } });
  • 匹配包括换行符的所有字符
    1db.collection.find({ field: { $regex: /pattern/, $options: 's' } });

这些选项可以根据实际需求组合使用。

4. 文本搜索(需创建文本索引)

 1// 创建文本索引(示例)
 2db.collection.createIndex({ content: "text" });
 3
 4// 使用 $text 操作符
 5{ 
 6  $text: { 
 7    $search: "mongodb tutorial", 
 8    $caseSensitive: false 
 9  } 
10}

四、综合示例

查询条件:年龄在 20-30 之间,且(姓名包含 “john” 或 角色是 “admin”)

 1const query = {
 2  age: { $gte: 20, $lte: 30 },
 3  $or: [
 4    { name: /john/i },
 5    { role: "admin" }
 6  ]
 7};
 8
 9const results = await collection.find(query)
10  .project({ name: 1, age: 1 })
11  .sort({ age: -1 })
12  .toArray();

五、注意事项

  1. 数据类型一致性
    确保查询值与字段存储类型一致(如数字 vs 字符串类型的年龄)。

  2. 正则性能优化

    • 避免左模糊查询(如 /.*john/),会导致全表扫描
    • 对高频正则查询字段建立索引(仅支持前缀匹配索引)
  3. 逻辑运算符嵌套
    复杂逻辑建议用 $and/$or 显式组合,提升可读性。

  4. 文本搜索限制
    $text 需要预先创建文本索引,且一个查询只能使用一次 $text

  5. 转义特殊字符
    动态拼接正则时需转义特殊字符(如 .*+?^${}()|[]\):

    1const search = "user+input";
    2const escaped = search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    3const regex = new RegExp(escaped, 'i');