Python中MongoDB可以同时操作多个集合吗?
我想同时查询多个 collection 的数据进行聚合,根据结果进行删除,有办法做到吗?
Python中MongoDB可以同时操作多个集合吗?
4 回复
Arangodb 可以在 collection 中 join
当然可以。MongoDB本身支持在单个操作中涉及多个集合,但“同时操作”的具体含义取决于你的需求。在Python的PyMongo驱动中,没有直接的“多集合原子事务”,但可以通过以下两种主要方式实现关联操作:
1. 使用多文档事务(MongoDB 4.0+) 这是最严格的方式,能保证跨多个集合(或数据库)的ACID原子性。你需要一个副本集或分片集群环境。
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['test_database']
# 启动会话和事务
with client.start_session() as session:
with session.start_transaction():
# 操作集合 A
db.collection_a.insert_one({'name': 'Alice', 'action': 'start'}, session=session)
# 操作集合 B
db.collection_b.update_one({'user': 'Alice'}, {'$inc': {'count': 1}}, session=session)
# 只有所有操作都成功,事务才会提交
# 任何异常都会导致事务中止并回滚
2. 使用 bulk_write 进行批量操作
虽然bulk_write主要针对单个集合,但你可以通过组织代码逻辑,依次对多个集合执行批量操作,以提高效率(但非原子性)。
from pymongo import InsertOne, UpdateOne
# 为集合A准备操作
ops_a = [InsertOne({'doc': i}) for i in range(5)]
# 为集合B准备操作
ops_b = [UpdateOne({'_id': i}, {'$set': {'processed': True}}, upsert=True) for i in range(5)]
# 按顺序执行批量操作
result_a = db.collection_a.bulk_write(ops_a)
result_b = db.collection_b.bulk_write(ops_b)
关键点总结:
- 需要原子性(同生共死):使用多文档事务(确保你的MongoDB版本和环境支持)。
- 只需要提高效率,可以接受中间状态:可以依次对多个集合使用**
bulk_write**。 - 常规的
insert_many、update_many等操作本身不支持跨集合。
简单建议:根据你的原子性需求选择事务或批量操作。
aggregate $lookup 可以做到
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

