查询数据
一、关系运算(比较运算符)
用于对字段值进行大小比较:
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"] } }
$gt
:是greater than
的缩写,表示“大于”。$lt
:是less than
的缩写,表示“小于”。$gte
:是greater than or equal to
的缩写,表示“大于等于”。$lte
:是less than or equal to
的缩写,表示“小于等于”。$eq
:是equal to
的缩写,表示“等于”。$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
的可选值包括:
i
:不区分大小写,允许匹配大小写不同的字符。m
:多行模式,允许正则表达式中的锚点(如^
和$
)在多行字符串中分别匹配每一行的开头和结尾。x
:扩展模式,忽略正则表达式中的空白字符和注释(以#
开头),方便编写复杂的正则表达式。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();
五、注意事项
-
数据类型一致性
确保查询值与字段存储类型一致(如数字 vs 字符串类型的年龄)。 -
正则性能优化
- 避免左模糊查询(如
/.*john/
),会导致全表扫描 - 对高频正则查询字段建立索引(仅支持前缀匹配索引)
- 避免左模糊查询(如
-
逻辑运算符嵌套
复杂逻辑建议用$and
/$or
显式组合,提升可读性。 -
文本搜索限制
$text
需要预先创建文本索引,且一个查询只能使用一次$text
。 -
转义特殊字符
动态拼接正则时需转义特殊字符(如.*+?^${}()|[]\
):1const search = "user+input"; 2const escaped = search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); 3const regex = new RegExp(escaped, 'i');