首页 > 编程笔记 > MongoDB 阅读:6

MongoDB聚合管道操作符大全(附带实例)

在 MongoDB 复杂查询中,聚合管道查询的应用较多。常用的聚合管道操作符如下表所示:

表:聚合管道操作符
名称 描述
$project 重塑流中的每个文档,例如通过添加新字段或删除现有字段。对于每个输入文档,输出一个文档
$match 过滤文档流,只允许匹配的文档未经修改地传递到下一个管道阶段。$match 使用标准的 MongoDB 查询。对于每个输入文档,输出一个文档(匹配)或零个文档(不匹配)
$redact 通过基于存储在文档本身中的信息限制每个文档的内容来重塑流中的每个文档。包含$project 和$match 的功能。可用于实现字段级编校。对于每个输入文档,输出一个或零个文档
$limit 将未修改的前 n 个文档传递到管道,其中 n 是指定的限制。对于每个输入文档,输出一个文档(前 n 个文档)或零个文档(在前 n 个文档之后)
$skip 跳过前 n 个文档,其中 n 是指定的跳过编号,并将未修改的其余文档传递到管道。对于每个输入文档,输出零个文档(对于前 n 个文档)或一个文档(如果在前 n 个文档之后)
$unwind 从输入文档中解构一个数组字段,为每个元素输出一个文档。每个输出文档都用一个元素值替换数组。对于每个输入文档,输出 n 个文档,其中 n 是数组元素的数量,对于空数组可以为零
$group 根据指定的标识符将文档分组,并将累加器表达式(如果指定)应用于每个组。使用所有输入文档,并为每个不同的组输出一个文档。输出文档仅包含标识符字段,如果指定,还包含累积字段
$sort 按指定的排序键重新排序文档流。只有订单发生变化,这些文档保持不变。对于每个输入文档,输出一个文档
$geoNear 根据与地理空间点的接近程度返回有序的文档流。结合了地理空间数据的$match、$sort 和$limit 功能。输出文档包括附加的距离字段,并且可以包括位置标识符字段
$out 将聚合管道的结果文档写入集合。要使用$out 阶段,它必须是管道中的最后一个阶段

【实例 1】通过使用 $match 运算符匹配 author 字段值的全部文档:
db.books.aggregate(
    { $match: { author : "罗贯中" } }
);

【实例 2】使用 $group 和 $sum 计算每个作者的图书总数。
db.books.aggregate([
    {
        $group: {
            _id: "$author", // 根据作者字段分组
            totalBooks: { $sum: 1 } // 计算每个组的文档数量
        }
    },
    {
        $sort: { totalBooks: -1 } // 按照图书总数降序排序
    }
]);
这个查询首先使用 $group 阶段按 author 字段对文档进行分组,并使用累加器 $sum 计算每个组的文档数量(即每个作者的图书总数)。然后,使用 $sort 阶段按图书总数降序排序结果。

【实例 3】使用 $project 和 $redact 重塑文档并限制字段。
db.books.aggregate([
    {
        $project: {
            title: 1,
            author: 1,
            publishYear: 1,
            _id: 0 // 排除文档ID
        }
    },
    {
        $redact: {
            $if: {
                cond: { $lt: ["$publishYear", 2000] }, // 如果出版年份小于2000
                then: { $set: { publishYear: "Before 2000" } } // 将出版年份设置为"Before 2000"
            }
        }
    }
]);
这个查询首先使用 $project 阶段来指定我们感兴趣的字段,并将 _id 设置为 0 以排除文档 ID。然后,使用 $redact 阶段基于条件(出版年份小于 2000)来修改或添加新字段。如果条件满足,publishYear 字段将被设置为 "Before 2000"。

相关文章