本文详细介绍 MongoDB 中 $or 操作符的使用,用于执行逻辑 OR 查询:匹配满足 至少一个 条件的文档。
$or 语法
db.yourCollectionName.find({
$or: [
{ "yourFieldName": yourValue1 },
{ "yourFieldName": yourValue2 }
]
}).pretty();
创建示例数据
> db.orOperatorDemo.insertOne({"StudentNames":["John","Carol","Sam"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6b80a6d78f205348bc61b") }
> db.orOperatorDemo.insertOne({"StudentNames":["Robert","Chris","David"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6b8266d78f205348bc61c") }
> db.orOperatorDemo.insertOne({"StudentNames":["John"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6b8346d78f205348bc61d") }
显示所有数据
> db.orOperatorDemo.find().pretty();
{ "_id" : ObjectId("5cd6b80a6d78f205348bc61b"), "StudentNames" : [ "John", "Carol", "Sam" ] }
{ "_id" : ObjectId("5cd6b8266d78f205348bc61c"), "StudentNames" : [ "Robert", "Chris", "David" ] }
{ "_id" : ObjectId("5cd6b8346d78f205348bc61d"), "StudentNames" : [ "John" ] }
查询:StudentNames 包含 "Carol" 或 "John"
> db.orOperatorDemo.find({
$or: [
{ "StudentNames": "Carol" },
{ "StudentNames": "John" }
]
}).pretty();
结果
{ "_id" : ObjectId("5cd6b80a6d78f205348bc61b"), "StudentNames" : [ "John", "Carol", "Sam" ] }
{ "_id" : ObjectId("5cd6b8346d78f205348bc61d"), "StudentNames" : [ "John" ] }
$or 核心特性
- 数组中的每个元素是一个完整的查询条件对象
- 文档满足 任意一个 条件即匹配
- 条件可以针对 同一字段 或 不同字段
- 可嵌套在
$and、$nor、$not中
不同字段的 $or 示例
// Name = "John" OR Age > 25
db.users.find({
$or: [
{ "Name": "John" },
{ "Age": { $gt: 25 } }
]
});
$or vs $in 对比
| 场景 | 推荐用法 | 示例 |
|---|---|---|
| 同一字段,多个可选值 | $in | { status: { $in: ["A", "B", "C"] } } |
| 不同字段,不同条件 | $or | { $or: [{name: "John"}, {age: {$gt: 30}}] } |
| 同一字段,复杂条件组合 | $or | { $or: [{score: {$gt: 90}}, {grade: "A"}] } |
| 数组字段,精确匹配元素 | $in 或 $all | { tags: { $in: ["mongodb"] } } |
性能提示
- $or 的每个子句最好都能使用索引
- 避免过多子句(建议 < 10 个)
- 可考虑重构 Schema 或使用 Text Search 替代复杂 $or