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 表达式中进行复杂的查询操作。