MongoDB 聚合管道中使用比较表达式运算符
比较表达式运算符主要用于实现表达式之间的比较运算,主要包含了等于、不等于、大于、大于等于、小于、小于等于、比较大小等比较操作。
下面我们进行详细介绍:
一、准备工作
初始化学生成绩
db.scores.insertMany([{ "_id" : 1, "name" : "张三", "eng" : 80, "math" : 70 },{ "_id" : 2, "name" : "李四", "eng" : 60, "math" : 90 },{ "_id" : 3, "name" : "王五", "eng" : 90, "math" : 50 }
])
二、等于($eq)
语法:{ $eq: [ <expression1>, <expression2> ] }
判断两个表达式结果是否相等
例子:查找张三的成绩
db.scores.aggregate([{$match: {$expr: { $eq: [ "$name", "张三" ] }}}
])
等效于:
db.scores.aggregate([{$match: {"name": "张三"}}
])
等效于:
db.scores.aggregate([{$match: {"name": { $eq: "张三" }}}
])
$match中如果要使用表达式运算符,需要使用$expr运算符
聚合查询的结果如下:
{ "_id" : 1, "name" : "张三", "eng" : 80, "math" : 70 }
三、不等于($eq)
语法:{ $ne: [ <expression1>, <expression2> ] }
判断两个表达式结果是否不相等
例子:查找除张三外的所有人的成绩
db.scores.aggregate([{$match: {$expr: { $ne: [ "$name", "张三" ] }}}
])
等效于:
db.scores.aggregate([{$match: {"name": { $ne: "张三" }}}
])
$match中如果要使用表达式运算符,需要使用$expr运算符
聚合查询的结果如下:
{ "_id" : 2, "name" : "李四", "eng" : 60, "math" : 90 }
{ "_id" : 3, "name" : "王五", "eng" : 90, "math" : 50 }
四、大于($gt)
语法:{ $gt: [ <expression1>, <expression2> ] }
判断第一个表达式的结果是否大于第二个表达式的结果
例子:查找英语成绩超过80的学生
db.scores.aggregate([{$match: {$expr: { $gt: [ "$eng", 80 ] }}}
])
等效于:
db.scores.aggregate([{$match: {"eng": { $gt: 80 }}}
])
聚合查询的结果如下:
{ "_id" : 3, "name" : "王五", "eng" : 90, "math" : 50 }
五、大于等于($gte)
语法:{ $gte: [ <expression1>, <expression2> ] }
判断第一个表达式的结果是否大于等于第二个表达式的结果
例子:查找英语成绩及格的学生
db.scores.aggregate([{$match: {$expr: { $gte: [ "$eng", 60 ] }}}
])
等效于:
db.scores.aggregate([{$match: {"eng": { $gte: 60 }}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "张三", "eng" : 80, "math" : 70 }
{ "_id" : 2, "name" : "李四", "eng" : 60, "math" : 90 }
{ "_id" : 3, "name" : "王五", "eng" : 90, "math" : 50 }
六、小于($lt)
语法:{ $lt: [ <expression1>, <expression2> ] }
判断第一个表达式的结果是否小于第二个表达式的结果
例子:查找数学成绩不及格的学生
db.scores.aggregate([{$match: {$expr: { $lt: [ "$math", 60 ] }}}
])
等效于:
db.scores.aggregate([{$match: {"math": { $lt: 60 }}}
])
聚合查询的结果如下:
{ "_id" : 3, "name" : "王五", "eng" : 90, "math" : 50 }
七、小于等于($lte)
语法:{ $lte: [ <expression1>, <expression2> ] }
判断第一个表达式的结果是否小于等于第二个表达式的结果
例子:查找数学成绩不超过80的学生
db.scores.aggregate([{$match: {$expr: { $lte: [ "$math", 80 ] }}}
])
等效于:
db.scores.aggregate([{$match: {"math": { $lte: 80 }}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "张三", "eng" : 80, "math" : 70 }
{ "_id" : 3, "name" : "王五", "eng" : 90, "math" : 50 }
八、比较大小($cmp)
语法:{ $cmp: [ <expression1>, <expression2> ] }
比较两个表达式的结果并返回
如果第一个表达式的结果小于第二个表达式的结果,则返回-1
如果第一个表达式的结果大于第二个表达式的结果,则返回1
如果两个表达式的结果相等,则返回0
例子:判断英语成绩是否超过80分
db.scores.aggregate([{$project: {"name": 1,"eng": 1,"result": { $cmp: [ "$eng", 80 ] }}}
])
聚合查询的结果如下:
{ "_id" : 1, "name" : "张三", "eng" : 80, "result" : 0 }
{ "_id" : 2, "name" : "李四", "eng" : 60, "result" : -1 }
{ "_id" : 3, "name" : "王五", "eng" : 90, "result" : 1 }
(1)张三的英语成语刚好等于80分,结果为0
(2)李四的英语成语小于80分,结果为-1
(3)王五的英语成语大于80分,结果为1