简介

MongoDB 中聚合(aggregate)次要用于解决数据(诸如统计平均值,求和等),并返回计算后的数据后果。

有点相似 SQL 语句中的 count(*)

罕用操作

表达式形容
$match用于过滤数据,只输入符合条件的文档。$match应用MongoDB的规范查问操作。
$project批改输出文档的构造。能够用来重命名、减少或删除域,也能够用于创立计算结果以及嵌套文档。
$limit用来限度MongoDB聚合管道返回的文档数。
$skip在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind将文档中的某一个数组类型字段拆分成多条,每条蕴含数组中的一个值。
$group将汇合中的文档分组,可用于统计后果。
$sort将输出文档排序后输入。
$lookup联表查问
$geoNear输入靠近某一地理位置的有序文档。
$facet/$bucket分类搜寻(MongoDB 3.4以上反对)

 

示例

$match

//查问条件 以某个分组查问 (能够多个查问条件累加到match外面)db.getCollection('doc_views').aggregate([    {        $match: { "orgName" : "前端技术部" }    }])//查问后果如下/* 1 */{    "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"),    "__v" : 0,    "time" : "2020-11-11",    "docName" : "testPublishAll",    "orgGroup" : "汽车事业群",    "orgName" : "前端技术部",    "count" : 3}...

$project

//删减字段db.getCollection('doc_views').aggregate([    {        $match: { "orgName" : "前端技术部" }    },    {        $project: {            docName: true,            orgName: true        }    }])//查问后果如下 只显示设置为true的字段/* 1 */{    "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"),    "docName" : "testPublishAll",    "orgName" : "前端技术部"}...//定义别名 把orgGroup指定指定成count字段db.getCollection('doc_views').aggregate([    {        $match: { "orgName" : "前端技术部" }    },    {        $project: {            docName: true,            orgName: true,            orgGroup: "$count"        }    }])//查问后果orgGroup字段展现count的值/* 1 */{    "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"),    "docName" : "testPublishAll",    "orgName" : "前端技术部",    "orgGroup" : 3}

$group

//聚合条件 _id :强制必须存在。 db.getCollection('doc_views').aggregate([    {        $group: {             _id: { name: "$docName", orgName: "$orgName" },           total: { $sum: "$count" }         }    }    ])//1、_id: null  _id为null的查问后果/* 1 */{    "_id" : null,    "total" : 474}//2、_id: "$docName" _id为某字段/* 1 */{    "_id" : "gch-gitbook",    "total" : 8}...//3、_id: { name: "$docName", orgName: "$orgName" } _id查问条件并为字段定义别名/* 1 */{    "_id" : {        "name" : "vuepress-hjw-test",        "orgName" : "前端技术部"    },    "total" : 2}

$sort、$skip、$limit

//列表分页的时候个别三个联结应用来做数据分页//sort列表排序 skip指定跳过多少条 limit每次查问条数//skip的计算形式:(以后页码-1)*每页大小 如:(pageIndex - 1) * pageSizedb.getCollection('doc_views').aggregate([    {$sort: {_id: -1}},    {$skip:Number(100)},    {$limit:Number(10)} ])//查问后果如下/* 1 */{    "_id" : ObjectId("604ecc57b3b65a411b5600de"),    "__v" : 0,    "time" : "2021-02-25",    "docName" : "abgFeedback",    "docType" : "vuepress",    "orgGroup" : "汽车事业群",    "orgName" : "前端技术部",    "count" : 1}/* 2 */{    "_id" : ObjectId("604ecc57b3b65a411b5600dd"),    "__v" : 0,    "time" : "2021-02-24",    "docName" : "testtestdocs",    "docType" : "docsify",    "orgGroup" : "汽车事业群",    "orgName" : "前端技术部",    "count" : 1}

$lookup

//联表查问db.getCollection('doc_views').aggregate([    {$sort: {_id: -1}},    {$skip:Number(100)},    {$limit:Number(10)},    {$lookup:{        from: "docs",        localField: "docName",        foreignField: "name",        as: "child"    }}])//查问后果/* 1 */{    "_id" : ObjectId("604ecc57b3b65a411b5600de"),    "__v" : 0,    "time" : "2021-02-25",    "docName" : "abgFeedback",    "docType" : "vuepress",    "orgGroup" : "汽车事业群",    "orgName" : "前端技术部",    "count" : 1,    "child" : [         {            "_id" : ObjectId("5f6da851a18a783210da7a16"),            "docType" : "vuepress",            "name" : "abgFeedback",            "description" : "二手车问题反馈收集问题",            "owner" : "gongchenghui",            "orgGroup" : "汽车事业群",            "orgName" : "前端技术部",            "newGit" : false,            "toTop" : ISODate("2020-11-20T02:41:33.742Z"),            "realName" : "龚成辉",            "dest" : "abgFeedback",            "opendFiles" : [],            "createTime" : ISODate("2020-09-25T08:20:33.373Z")        }    ]}

$facet 分类查问

//依据条件 分类一次查问出想要的数据和数据的总数db.getCollection('doc_views').aggregate([    {$match: {"orgName" : "前端技术部"}},    {        $facet: {            respData: [                {$sort: {_id: -1}},                {$skip:Number(100)},                {$limit:Number(1)},            ],            total: [                {                    $count: "total"                }            ]        }    }//查问后果如下  /* 1 */{    "respData" : [         {            "_id" : ObjectId("604ecc57b3b65a411b5600de"),            "__v" : 0,            "time" : "2021-02-25",            "docName" : "abgFeedback",            "docType" : "vuepress",            "orgGroup" : "汽车事业群",            "orgName" : "前端技术部",            "count" : 1        }    ],    "total" : [         {            "total" : 284        }    ]}

留神:此办法只能在3.4以上版本的数据库中应用,低版本的话还是做两次查问