如何使用 Python 的 pymongo 模块进行多表查询数据?

比如 A 表为用户表(此表内没有用户充值信息[充值金额、充值日期]) B 表为充值表
想获取用户充值情况。
如何使用 Python 的 pymongo 模块进行多表查询数据?

3 回复

在 MongoDB 里没有传统 SQL 的“多表查询”,但你可以通过 $lookup 聚合操作来实现类似功能。$lookup 相当于 SQL 的 LEFT OUTER JOIN。下面是一个完整示例,假设你有 ordersusers 两个集合,要通过 user_id 关联查询。

from pymongo import MongoClient

# 连接 MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['your_database']

# 执行 $lookup 聚合查询
pipeline = [
    {
        '$lookup': {
            'from': 'users',           # 要关联的集合
            'localField': 'user_id',   # 本地集合的关联字段
            'foreignField': '_id',     # 目标集合的关联字段
            'as': 'user_info'          # 输出字段名
        }
    },
    {
        '$unwind': '$user_info'        # 将数组展开为对象(如果是一对一)
    },
    {
        '$project': {                  # 选择要返回的字段
            'order_id': 1,
            'amount': 1,
            'user_name': '$user_info.name',
            'user_email': '$user_info.email'
        }
    }
]

# 执行查询
results = db.orders.aggregate(pipeline)

# 打印结果
for doc in results:
    print(doc)

关键点解释:

  1. $lookup 是核心,它把 users 集合中匹配 _id 等于 orders.user_id 的文档,作为一个数组放到 user_info 字段里。
  2. $unwinduser_info 数组拆开,变成单个对象(如果确定是一对一关系)。
  3. $project 用来控制输出格式,这里只选了订单ID、金额和关联的用户名、邮箱。

注意: 如果是一对多关系(比如一个用户有多个订单),就不需要 $unwind,直接处理数组即可。

总结:用 aggregate 管道里的 $lookup 阶段来实现多集合关联查询。


find 两次,不过一般不这样用 MongoDB,最好把 b 表的数据存在 a 表里

类似 SQL 的 Join ?用 aggregation,$lookup

回到顶部