MongoDB 分组查询

模拟数据:

import random
from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017").chapter_7.example_post3
name_list = ['张三', '李四', '王五', '赵六']
date_list = ['2018/6/1', '2018/6/2', '2018/6/3', '2018/6/4']

for i in range(20):
    client.insert_one({
        '姓名': random.choice(name_list),
        '日期': random.choice(date_list),
        '分数': random.randint(50, 100)
    })

MongoDB 分组查询_第1张图片

要求

  1. 对name字段去重
  2. 求每个人计算得分的最大值、最小值、平均分、总分,并统计每个人有多少条记录
  3. 以name字段为基准对文档去重,仅保留最新的一条数据
  4. 以name字段为基准对文档去重,仅保留最老的一条数据

一、分组的基本语法

  • 分组的本质就是聚合+去重,如果使用distinct函数去重,像下面这样:
db.getCollection('example_post3').distinct('姓名')

在这里插入图片描述
会得到一行去重的记录。

  • 用分组操作$group的语句如下:
db.getCollection('example_post3').aggregate([
	{'$group':{
		'_id':'$姓名'
	}}
])

MongoDB 分组查询_第2张图片
会得到一列(多条)记录。

二、分组并计算统计值

collection.aggregate([
	{'$group':{
		'_id':'$被去重的字段名',
		'最大值':{'$max':'$要计算的字段名'},
		'最小值':{'$min':'$要计算的字段名'},
		'平均值':{'$avg':'$要计算的字段名'},
		'记录条数':{'$sum':1},
		'求和':{'$sum':'$要计算的字段名'}
	}}
])

比如:

db.getCollection('example_post3').aggregate([
	{'$group':{
		'_id':'$姓名',
		'最高分':{'$max':'$分数'},
		'最低分':{'$min':'$分数'},
		'平均分':{'$avg':'$分数'},
		'学科总数':{'$sum':1},
		'总分':{'$sum':'$分数'}
	}}
])

MongoDB 分组查询_第3张图片

三、最新或最老的数据

$last 最新和 $first最老
比如:

db.getCollection("example_post3").aggregate([
	{'$group':{
		'_id':'$姓名',
		'最新日期':{'$last':'$日期'},
		'最新分数':{'$last':'$分数'},
	}},
])

MongoDB 分组查询_第4张图片

你可能感兴趣的:(数据库相关,mongodb)