MongoDB 不专业指北(十):实用数组聚合操作(下)

572 阅读1分钟

这是我参与更文挑战的第29天,活动详情查看: 更文挑战

前言

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 提供的聚合操作来看,可以实现很多非常实用的查询操作。但是组合一多起来,确实形式上也变得多起来,很难记得住。因此,在用到的时候再翻阅相应的示例就可以直接使用,这也是编写实用数组聚合操作这三篇文章的目的之一。