Mongodb中自带的基本聚合函数有三种:count、distinct和group。下面我们分别来讲述一下这三个基本聚合函数。
db.collection.aggregate( {$match:{x:1}, {limit:10}, {$group:{_id:"$age"}}} );
操作符介绍:
$project:包含、排除、重命名和显示字段
$match:查询,需要同find()一样的参数
$limit:限制结果数量
$skip:忽略结果的数量
$sort:按照给定的字段排序结果
$group:按照给定表达式组合结果
$unwind:分割嵌入数组到自己顶层文件
这是MongoDB官网上的一个Data Model:
{ "_id": "10280",//zipcode "city": "NEW YORK",//城市 "state": "NY",//城市缩写 "pop": 5574,//人口 "loc": [ //经纬度 -74.016323, 40.710537 ] }
1、查出一个超过1千万人口的城市
db.zipcodes.aggregate( {$group:{_id:"$state", totalPop:{$sum:"$pop"}}, {$match:{totalPop:{$gte:10000000}}} );
例如现在有个表,表中的state有三种状态,统计下三种状态的数据各有多少
Info.aggregate([{$group : {_id : "$state", num_tutorial : {$sum : 1}}}]).exec((err,docs)=>{ if(docs){ res.json({ status:0, result:docs }) }else{ res.json({ status:1, result:err }) } })
num_tutorial : {$sum : 1}}
这句num_tutorial,可以自己定义,$sum是写死的,必须这么写。统计结果如下
const arrAttribute = await models.institutionAttributes.aggregate( [ { $lookup:连表关键词,类似mysql中的left join { from: "exhibition_institutions",//需要连接的表名 localField: "_id",//本表需要关联的字段 foreignField: "attribute",//被连接表需要关联的字段 as: "institutionsData"//查询出的结果集别名 } }, { $match://条件筛选关键词,类似mysql中的where { _id: mongoose.Types.ObjectId(team),//指定条件,在这里我指定了id, } }, { $project://指定查询字段的关键词 { _id: 0,//由于会默认展示_id,在这里设置为0,不展示 name: 1,//展示一个字段名称为name的字段 "institutionsData._id": 1,//同上 } }, ] ); //下面这一段可以忽略,只是对结果进行筛选 let arrAttributeSort = []; for (let i = 0; i < arrAttribute.length; i++) { for (let j = 0; j < arrAttribute[i].institutionsData.length; j++) { arrAttributeSort.push(arrAttribute[i].institutionsData[j]._id); } } const signData = await models.exhibitionItem.aggregate( [ { $lookup: { from: "signups", localField: "_id", foreignField: "exhibition_item", as: "signInstitutionsData" } }, { $match: { "signInstitutionsData": { $ne: [] },//$ne:[]用来剔除结果集中的空数组 from: { $gte: parseInt(from) },,//大于等于 to: { $lte: parseInt(to) },//小于等于 "signInstitutionsData.institutions.institution": { $in: arrAttributeSort }//$in是批量查询,[1,2,3,4,5]这种形式的数组可以直接进行查询 } }, { $project: { _id: 0, "signInstitutionsData.unit_name": 1, "signInstitutionsData.institutions": 1 } } ] );
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接