Python中使用MongoDB进行数据聚合的基本操作

2023-04-15 00:00:00 数据 操作 聚合
  1. 连接MongoDB数据库

在Python中使用MongoDB之前,需要先连接MongoDB数据库。可以使用pymongo库连接MongoDB。示例代码如下:

from pymongo import MongoClient

client = MongoClient()
db = client['mydb']

其中,'mydb'是数据库名称。如果MongoDB是在本地运行,不需要传入参数,直接使用client = MongoClient()连接。如果MongoDB运行在远程服务器上,需要传入MongoDB的地址和端口号,例如:client = MongoClient('mongodb://<host>:<port>/')。如果MongoDB需要认证,还需要传入用户名和密码,例如:client = MongoClient('mongodb://<user>:<password>@<host>:<port>/')

  1. 筛选

MongoDB中常用的筛选操作有$match$project$limit$skip等。其中,$match用于筛选符合条件的文档,$project用于选择文档的某些字段,$limit用于限制返回的文档数量,$skip用于跳过某些文档。例如,假设有如下数据:

{
    "name": "Peter",
    "age": 20,
    "address": {
        "city": "Shanghai",
        "street": "Xuhui"
    }
}
{
    "name": "John",
    "age": 25,
    "address": {
        "city": "Shanghai",
        "street": "Minhang"
    }
}
{
    "name": "Mary",
    "age": 30,
    "address": {
        "city": "Beijing",
        "street": "Haidian"
    }
}

要筛选出年龄大于等于25岁的人,可以使用如下代码:

pipeline = [
    {
        "$match": {"age": {"$gte": 25}}
    }
]

result = db.my_collection.aggregate(pipeline)

其中,my_collection是集合名称。$match操作符用于筛选年龄大于等于25岁的文档。

要选择出姓名和年龄字段,可以使用如下代码:

pipeline = [
    {
        "$project": {"name": 1, "age": 1, "_id": 0}
    }
]

result = db.my_collection.aggregate(pipeline)

其中,"_id": 0表示不展示MongoDB自动生成的_id字段。

  1. 分组

MongoDB中使用$group操作符进行分组。例如,假设有如下数据:

{
    "name": "Peter",
    "age": 20,
    "address": {
        "city": "Shanghai",
        "street": "Xuhui"
    }
}
{
    "name": "John",
    "age": 25,
    "address": {
        "city": "Shanghai",
        "street": "Minhang"
    }
}
{
    "name": "Mary",
    "age": 30,
    "address": {
        "city": "Beijing",
        "street": "Haidian"
    }
}

要按照城市对文档进行分组,并计算每个城市的年龄平均值,可以使用如下代码:

pipeline = [
    {
        "$group": {"_id": "$address.city", "avg_age": {"$avg": "$age"}}
    }
]

result = db.my_collection.aggregate(pipeline)

其中,"$address.city"表示按照地址中的城市字段进行分组,"$age"表示对年龄字段求平均值。

  1. 排序

MongoDB中使用$sort操作符进行排序。例如,假设有如下数据:

{
    "name": "Peter",
    "age": 20,
    "address": {
        "city": "Shanghai",
        "street": "Xuhui"
    }
}
{
    "name": "John",
    "age": 25,
    "address": {
        "city": "Shanghai",
        "street": "Minhang"
    }
}
{
    "name": "Mary",
    "age": 30,
    "address": {
        "city": "Beijing",
        "street": "Haidian"
    }
}

要对文档按照年龄从小到大排序,可以使用如下代码:

pipeline = [
    {
        "$sort": {"age": 1}
    }
]

result = db.my_collection.aggregate(pipeline)

其中,1表示按照升序排序,-1表示按照降序排序。

示例代码:

from pymongo import MongoClient

client = MongoClient()
db = client['mydb']

# 筛选操作
pipeline = [
    {
        "$match": {"age": {"$gte": 25}}
    },
    {
        "$project": {"name": 1, "age": 1, "_id": 0}
    }
]
result = db.my_collection.aggregate(pipeline)
for item in result:
    print(item)

# 分组操作
pipeline = [
    {
        "$group": {"_id": "$address.city", "avg_age": {"$avg": "$age"}}
    }
]
result = db.my_collection.aggregate(pipeline)
for item in result:
    print(item)

# 排序操作
pipeline = [
    {
        "$sort": {"age": 1}
    }
]
result = db.my_collection.aggregate(pipeline)
for item in result:
    print(item)

以上代码可以在MongoDB中执行后查看结果。

相关文章