MongoDB聚合
aggregate
聚合管道功能:
對(duì)文檔進(jìn)行過濾,查詢出符合條件的文檔
對(duì)文檔進(jìn)行變換,改變文檔的輸出形式
使用sanic_motor模塊連接數(shù)據(jù)庫(kù)
from sanic import Sanic from sanic.views import HTTPMethodView from sanic.response import json, text, redirect, html from sanic_motor import BaseModelapp = Sanic(__name__)# 設(shè)置數(shù)據(jù)庫(kù)和集合 settings = {'MOTOR_URI': 'mongodb://localhost:27017/XXX', 'LOGO': None} app.config.update(settings) app.config.RESPONSE_TIMEOUT = 5*60 BaseModel.init_app(app)class Subjectscope(BaseModel):__coll__ = 'XXX'class Subject2020(HTTPMethodView):async def get(self, request):UniversityList = await Subjectscope.find(as_raw=True)RucodeList = []for Uni in UniversityList.objects:Rucode = Uni.get("Rucode", "")if Rucode not in RucodeList:RucodeList.append(Rucode)else:continueprint(RucodeList)return json({"Rucode": "success"}) app.add_route(Subject2020.as_view(), 'rucodelist')class SubjectAggregate(HTTPMethodView):async def get(self, request):my_pipeline =[# {"$skip":33440},{"$match":{"Rucode":{"$gte":'10001',"$lte":'10090'}}},# {"$group":{"_id":"$Rucode", "count":{"$sum":1}}}{"$project":{"_id":0,"_rucode":"$Rucode","SchoolName":1,"ProfessionalType":1,"typeid": {"$type":"$_id"},"scopeMid":"$_id"}},{"$sort":{"_rucode":-1}},{"$limit":10},{"$sample":{"size":4}},# {"$group":{"_id":"$ProfessionalType","count":{"$sum":1}}}]Myaggregate = await Subjectscope.aggregate(pipeline=my_pipeline)print(len(Myaggregate))return json(Myaggregate) app.add_route(SubjectAggregate.as_view(), 'aggregate') if __name__ == '__main__':app.run(host="127.0.0.1", port=8003, workers=1) db.getCollection('subjectscope2020_benke').aggregate([{"$match":{"Rucode":{"$gt":'10001',"$lte":'10003'}}},//{"$project":{"_id":0, "Rucode":1, "SchoolName":1, "ProfessionalType":1}} ])1.聚合管道
一、階段操作符
1.$project
提取(修改文檔結(jié)構(gòu)、重命名、增加或刪除字段)
db.getCollection('subjectscope2020_benke').aggregate([ {$project:{aid:{$type:"$_id"},brucode:{$type:"$Rucode"},cshcoolname:"$SchoolName"} } ])2.$match
篩選
3.$group
分組
$sum 計(jì)算總和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) $avg 計(jì)算平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) $min 獲取集合中所有文檔對(duì)應(yīng)值得最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) $max 獲取集合中所有文檔對(duì)應(yīng)值得最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) $push 在結(jié)果文檔中插入值到一個(gè)數(shù)組中。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) $addToSet 在結(jié)果文檔中插入值到一個(gè)數(shù)組中,但不創(chuàng)建副本。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) $first 根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) $last 根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù) db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])4.$sort
排序
5.$limit
限制
6.$skip
跳過
7.$unwind
拆分
每個(gè)文檔包含數(shù)組中的一個(gè)值
二、表達(dá)式操作符
1.布爾管道聚合操作(Boolean Aggregation Operators)
$and $or $not
2.集合操作(Set Operators)
? $setEquals $setIntersection $setUnion $serDifference $setIsSubset $anyElementTrue $allElementsTrue3.比較聚合操作(Comparison Aggregation Operators)
$cmp 比較表達(dá)式中兩個(gè)值的大小,如果第一個(gè)值小于第二個(gè)值則返回-1,相等返回0,大于返回1。用法{ $cmp: [ <expression1>, <expression2> ] } $eq 比較表達(dá)式中兩個(gè)是否相等,是則返回true,否則返回false。用法{ $eq: [ <expression1>, <expression2> ] } $gt 比較表達(dá)式中第一個(gè)值是否大于第二個(gè)值,是則返回true,否則返回false。用法{ $gt: [ <expression1>, <expression2> ] } $gte 大于等于 $lt 比較表達(dá)式中第一個(gè)值是否小于第二個(gè)值,是則返回true,否則返回false。用法{ $lt: [ <expression1>, <expression2> ] } $lte 小于等于 $ne 是否不相等 not equals4.算術(shù)聚合操作(Arithmetic Aggregation Operators)
$abs $add $ceil $divide $exp $floor $ln $log $log10 $mod $multiply $pow $sqrt $subtract $trunc5.字符串聚合操作(String Aggregation Operators)
$concat $indexOfBytes $indexOfCP $split $strLenBytes $strLenCP $strcasecmp $substr $substrBytes $substrCP $toLower $toUpper6.數(shù)組聚合操作(Array Aggregation Operators)
$arrayElemAt $concatArrays $filter $indexOfArray $isArray $range $reverseArray $reduce $size $slice $zip $in7.日期聚合操作(Date Aggregation Operators)
$dayOfYear $dayOfMonth $dayOfWeek $year $month $week $hour $minute $second $millisecond $dateToString $isoDayOfWeek $isoWeek $isoWeekYear8.條件聚合操作(Conditional Aggregation Operators)
$cond $ifNull $switch9.數(shù)據(jù)類型聚合操作(Data Type Aggregation Operators)
$type10.其他
//$exists 存在 db.person.find( { phone: { $exists: true } } )2.單目的聚合操作
"SS_Class_Info":{"$exists":true}
distinct("name":{"$exists":true})
去重
count()
返回文檔個(gè)數(shù)
# 求出集合 article 中 time 值大于 2017-04-09 的文檔個(gè)數(shù) db.article.count({time:{$gt:newDate('04/09/2017')}}) # 這個(gè)語(yǔ)句等價(jià)于 db.article.find({time:{$gt:newDate('04/09/2017')}}).count()
db.getCollection('SS_SeleCourseResult').aggregate([ {"$match":{"Choose_Subject_Task_ID" : "5c106c08705deb0862d3bfa9"}}, {"$match":{"result":{"$elemMatch":{"Subject":"物理","Status":1,"SS_Class_Info":{"$exists":true},"SS_Class_Info.Class_Name":"物理選考2班"}}}}, {"$unwind":"$result"}, {"$match":{"result.Subject":"","result.Status":3}}, {"$group":{"_id":"$result.SS_Class_Info.Class_Name","studentlist":{"$push":"$UserStudent_Name"}}} ]) db.getCollection('sort_SubjectSCope2020').aggregate([ {"$match":{"Rucode":{"$gte":"10001","$lt":"10002"}}}, {"$unwind":"$ScopeArea"}, {"$match":{"ScopeArea.Province":"浙江省",}}, {"$unwind":"$ProfessionalName"}, {"$project":{"_id":0,"SchoolName":1,"ProfessionalType":1,"ProfessionalName":1,"Scope":1}}, {"$group":{"_id":"$Scope","count":{"$sum":1},"pfnamelist":{"$push":"$ProfessionalName"}}}, ])
轉(zhuǎn)載于:https://www.cnblogs.com/spacescp/p/10183121.html
總結(jié)
- 上一篇: 映芬视觉网页练习
- 下一篇: Run-time Settings--G