查询运算符(比较、逻辑、元素、数组、位运算等)
MongoDB提供了丰富的查询运算符,用于在查询文档时进行各种操作。这些运算符可以分为比较、逻辑、元素、数组和位运算等类型,每种类型都有特定的用途和语法。
比较运算符
比较运算符用于比较字段值与指定值之间的关系。常用的比较运算符包括:
$eq
:匹配等于指定值的字段$ne
:匹配不等于指定值的字段$gt
:匹配大于指定值的字段$gte
:匹配大于或等于指定值的字段$lt
:匹配小于指定值的字段$lte
:匹配小于或等于指定值的字段$in
:匹配数组中任意一个值的字段$nin
:不匹配数组中任意一个值的字段
// 查找年龄大于25的用户
db.users.find({ age: { $gt: 25 } })
// 查找状态为"active"或"pending"的用户
db.users.find({ status: { $in: ["active", "pending"] } })
逻辑运算符
逻辑运算符用于组合多个查询条件,实现复杂的逻辑判断。主要的逻辑运算符有:
$and
:逻辑与,所有条件都必须满足$or
:逻辑或,至少一个条件必须满足$not
:逻辑非,反转查询条件$nor
:逻辑或非,所有条件都不满足
// 查找年龄大于25且状态为active的用户
db.users.find({
$and: [
{ age: { $gt: 25 } },
{ status: "active" }
]
})
// 查找年龄小于20或大于30的用户
db.users.find({
$or: [
{ age: { $lt: 20 } },
{ age: { $gt: 30 } }
]
})
元素运算符
元素运算符用于检查文档中字段的存在性或数据类型:
$exists
:检查字段是否存在$type
:检查字段的BSON类型
// 查找有email字段的用户
db.users.find({ email: { $exists: true } })
// 查找age字段为数字类型的用户
db.users.find({ age: { $type: "number" } })
数组运算符
数组运算符专门用于处理数组字段:
$all
:匹配包含所有指定元素的数组$elemMatch
:匹配数组中至少有一个元素满足所有指定条件$size
:匹配指定长度的数组
// 查找skills数组同时包含"JavaScript"和"MongoDB"的用户
db.users.find({ skills: { $all: ["JavaScript", "MongoDB"] } })
// 查找成绩数组中至少有一个大于90且课程为math的记录
db.users.find({
scores: {
$elemMatch: {
score: { $gt: 90 },
course: "math"
}
}
})
位运算符
位运算符用于对整数值进行位操作:
$bitsAllSet
:匹配所有指定位都设置为1的字段$bitsAnySet
:匹配任何指定位设置为1的字段$bitsAllClear
:匹配所有指定位都清除为0的字段$bitsAnyClear
:匹配任何指定位清除为0的字段
// 查找flags字段的第1位和第3位都设置为1的文档
db.users.find({ flags: { $bitsAllSet: [1, 3] } })
// 查找permissions字段的第2位或第4位设置为1的文档
db.users.find({ permissions: { $bitsAnySet: [2, 4] } })
评估运算符
评估运算符允许在查询中使用JavaScript表达式或其他评估方式:
$expr
:允许在查询语言中使用聚合表达式$jsonSchema
:根据给定的JSON模式验证文档$mod
:对字段值执行模运算并匹配结果$regex
:提供正则表达式匹配字符串$text
:执行文本搜索
// 使用表达式比较两个字段
db.sales.find({
$expr: {
$gt: ["$revenue", "$cost"]
}
})
// 使用正则表达式匹配以"John"开头的名字
db.users.find({ name: { $regex: /^John/ } })
地理空间运算符
MongoDB提供了专门的地理空间查询运算符:
$geoWithin
:匹配完全包含在指定几何图形内的地理空间数据$geoIntersects
:匹配与指定几何图形相交的地理空间数据$near
:返回接近指定点的文档,按距离排序$nearSphere
:类似$near,但使用球面几何计算距离
// 查找位于指定多边形区域内的地点
db.places.find({
location: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [[[0,0], [3,6], [6,0], [0,0]]]
}
}
}
})
投影运算符
投影运算符用于控制查询返回的字段:
$
:投影数组中匹配查询条件的第一个元素$elemMatch
:投影数组中匹配指定条件的第一个元素$meta
:投影文本搜索的分数或其他元数据$slice
:限制返回数组元素的数量
// 只返回comments数组中第一个匹配条件的元素
db.posts.find(
{ "comments.author": "John" },
{ "comments.$": 1 }
)
// 返回scores数组的前3个元素
db.students.find(
{},
{ scores: { $slice: 3 } }
)
更新运算符
虽然主要用于更新操作,但这些运算符在查询上下文中也有特殊用途:
$
:充当占位符,更新与查询条件匹配的第一个数组元素$[]
:充当占位符,更新所有匹配查询条件的数组元素$[<identifier>]
:与arrayFilters一起使用,更新匹配arrayFilters条件的数组元素
// 更新第一个状态为"pending"的订单
db.orders.update(
{ "items.status": "pending" },
{ $set: { "items.$.status": "processing" } }
)
聚合管道运算符
在聚合管道中使用的特殊查询运算符:
$match
:过滤文档,类似于find()$lookup
:执行左外连接$graphLookup
:执行递归搜索$redact
:基于字段值限制文档内容
// 在聚合管道中使用$match
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$customer", total: { $sum: "$amount" } } }
])
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:批量操作(bulkWrite)