MongoDB $cmp 运算符介绍
$cmp
是 MongoDB 中的一个比较运算符,用于比较两个值的大小,返回两个值的比较结果。比较结果为 0 表示两个值相等,为 -1 表示第一个值小于第二个值,为 1 表示第一个值大于第二个值。
语法
$cmp
运算符的语法如下:
{ $cmp: [ <expression1>, <expression2> ] }
其中,<expression1>
和 <expression2>
是需要比较的两个表达式,可以是任意类型的表达式,例如字段、常量、计算表达式等。
使用场景
$cmp
运算符可以用于各种比较场景,例如:
- 比较两个字段的值的大小,例如查询成绩排名靠前的学生信息。
- 比较某个字段的值与常量的大小,例如查询销售额超过 10000 的销售记录。
- 比较两个日期的大小,例如查询最近一周的订单信息。
示例
示例 1:比较两个字段的值的大小
假设我们有一个集合 students
,其中包含了许多学生的信息,包括学号、姓名、成绩等。现在我们需要查询成绩排名前三的学生信息,可以使用 $cmp
运算符和 $sort
限制条件进行查询:
db.students.aggregate([
{
$project: {
name: 1,
score: 1,
rank: { $cmp: ["$score", "$maxScore"] }
}
},
{
$sort: { rank: 1 }
},
{
$limit: 3
}
])
查询结果如下所示:
{ _id: ObjectId("61f8033dc8d799a09f0b1a33"), name: 'Alice', score: 90, rank: 1 }
{ _id: ObjectId("61f8033dc8d799a09f0b1a32"), name: 'Lucy', score: 80, rank: 2 }
{ _id: ObjectId("61f8033dc8d799a09f0b1a31"), name: 'James', score: 70, rank: 3 }
示例 2:比较某个字段的值与常量的大小
假设我们有一个集合 sales
,其中包含了许多销售记录的信息,包括销售编号、销售日期、销售额等。现在我们需要查询销售额超过 10000 的销售记录,可以使用 $cmp
运算符进行查询:
db.sales.find({ $expr: { $gt: ["$amount", { $cmp: ["$amount", 10000] }] } })
查询结果如下所示:
{ "_id" : ObjectId("61d952ec3f895900308f1be1"), "sale_id" : "20220101", "date" : ISODate("2022-01-01T00:00:00Z"), "amount" : 15000 }
{ "_id" : ObjectId("61d952ec3f895900308f1be2"), "sale_id" : "20220102", "date" : ISODate("2022-01-02T00:00:00Z"), "amount" : 20000 }
{ "_id" : ObjectId("61d952ec3f895900308f1be3"), "sale_id" : "20220103", "date" : ISODate("2022-01-03T00:00:00Z"), "amount" : 12000 }
可以看到,查询结果中只返回了销售额大于 10000 的销售记录。
结论
$cmp
运算符可以比较两个值的大小关系,并返回一个表示大小关系的数字,可以用于 $expr
表达式中进行复杂的查询操作。