前言
MongoDB 提供了 aggregate 聚合操作函数对多个文档进行筛选、排序、统计等操作,这些操作可以在上两篇中查看:
本篇是聚合操作的最后一篇,将介绍如何在聚合操作中实用条件比较。
对字段做布尔转换
使用$project 操作符时,可以对字段进行条件比较,从而转为布尔值,例如将年龄转换为是否超过30岁。
db.employees.aggregate(
[
{$match: {dept: '研发部'}},
{
$project: {
name: 1,
dept: 1,
age: {$gt: ['$age', 30]}
}
}
]
);
{
"_id" : ObjectId("60d734f0d8079507891982a8"),
"name" : "岛上码农",
"dept" : "研发部",
"age" : false
}
{
"_id" : ObjectId("60d734f0d8079507891982a9"),
"name" : "Amy",
"dept" : "研发部",
"age" : true
}
{
"_id" : ObjectId("60d734f0d8079507891982ab"),
"name" : "Cathy",
"dept" : "研发部",
"age" : true
}
{
"_id" : ObjectId("60d734f0d8079507891982ad"),
"name" : "Jenny",
"dept" : "研发部",
"age" : false
}
条件匹配
在$match 中也可以通过条件进行过滤,比如找出研发部超过30岁的人员。
db.employees.aggregate(
[
{$match: {dept: '研发部', age: {$gt: 30}}},
{
$project: {
name: 1,
dept: 1,
age: 1
}
}
]
);
组合条件将字段转换为布尔值
$project操作将字段转换为布尔值时也可以实用组合条件,例如将年龄在30岁以上,36岁以下的age字段转为 true,其他的转为false。
db.employees.aggregate(
[
{$match: {dept: '研发部'}},
{
$project: {
name: 1,
dept: 1,
age: {
$and: [{$gt: ['$age', 30]},{$lt: ['$age', 36]}]
}
}
}
]
);
{
"_id" : ObjectId("60d734f0d8079507891982a8"),
"name" : "岛上码农",
"dept" : "研发部",
"age" : false
}
{
"_id" : ObjectId("60d734f0d8079507891982a9"),
"name" : "Amy",
"dept" : "研发部",
"age" : true
}
{
"_id" : ObjectId("60d734f0d8079507891982ab"),
"name" : "Cathy",
"dept" : "研发部",
"age" : true
}
{
"_id" : ObjectId("60d734f0d8079507891982ad"),
"name" : "Jenny",
"dept" : "研发部",
"age" : false
}
在 $match 中使用组合条件
$match 用于条件筛选,自然也是支持组合条件筛选的,同样的筛选出研发部大于30岁,36岁以下的人员:
db.employees.aggregate(
[
{
$match: {
dept: '研发部',
$and: [
{age: {$gt: 30}},
{age: {$lt:36}},
]
}
},
{
$project: {
name: 1,
dept: 1,
age: 1
}
}
]
);
{
"_id" : ObjectId("60d734f0d8079507891982a9"),
"name" : "Amy",
"dept" : "研发部",
"age" : 35
}
{
"_id" : ObjectId("60d734f0d8079507891982ab"),
"name" : "Cathy",
"dept" : "研发部",
"age" : 31
}
总结
从 MongoDB 提供的聚合操作来看,可以实现很多非常实用的查询操作。但是组合一多起来,确实形式上也变得多起来,很难记得住。因此,在用到的时候再翻阅相应的示例就可以直接使用,这也是编写实用数组聚合操作这三篇文章的目的之一。
网友评论