在 MongoDB 中使用 python 连接多个集合进行查询
Query with join on mutiple collections with python in MongoDB
我是 MongoDB 和 Python 的新手(使用 pymongo 3.10.1)。我可以查询一个集合,但我需要对两个集合执行连接
collection1 {
code
some other fields
}
collection2 {
code
some other fields
}
我想实现:
select * from collection2 left inner join collection1 on collection2.code = collection1.code
我只找到了 Python 到 MongoDB 查询的基本示例。
如何使用 Python 实现这一目标?我可以将 .aggregate 和 $lookup 与 Pythonn 一起使用吗?
所以我觉得你的问题分为两个部分:
如何使用 pymongo 进行更复杂的查询?
你如何加入 mongo?
第一个问题很简单,您可以声明任何类型的查询,只需使用 find({<your query>})
。这是来自 W3
的示例
你的主要问题的答案比较复杂。这是另一个 stack article,其中对其进行了更详细的讨论。但基本上从 3.2 开始,您可以使用 $lookup
进行连接。
我终于让它工作了,这里是完整的代码:
from pymongo import MongoClient
# connect to MongoDB, change the << MONGODB URL >> to reflect your own connection string
client = MongoClient(<< MONGODB URL >>)
db=client.mydb
docs = db.collection1.aggregate([{"$lookup":{
"from": "collection2", # other table name
"localField": "code", # key field in collection 2
"foreignField": "code", # key field in collection 1
"as": "linked_collections" # alias for resulting table
}},
{"$project": {"code": 1, "field_from_collection1": 1, "field_from_collection2": 1}}
])
#$project is to select fields we need, we could ommit it
for doc in docs:
print(doc)
我是 MongoDB 和 Python 的新手(使用 pymongo 3.10.1)。我可以查询一个集合,但我需要对两个集合执行连接
collection1 {
code
some other fields
}
collection2 {
code
some other fields
}
我想实现:
select * from collection2 left inner join collection1 on collection2.code = collection1.code
我只找到了 Python 到 MongoDB 查询的基本示例。 如何使用 Python 实现这一目标?我可以将 .aggregate 和 $lookup 与 Pythonn 一起使用吗?
所以我觉得你的问题分为两个部分:
如何使用 pymongo 进行更复杂的查询? 你如何加入 mongo?
第一个问题很简单,您可以声明任何类型的查询,只需使用 find({<your query>})
。这是来自 W3
你的主要问题的答案比较复杂。这是另一个 stack article,其中对其进行了更详细的讨论。但基本上从 3.2 开始,您可以使用 $lookup
进行连接。
我终于让它工作了,这里是完整的代码:
from pymongo import MongoClient
# connect to MongoDB, change the << MONGODB URL >> to reflect your own connection string
client = MongoClient(<< MONGODB URL >>)
db=client.mydb
docs = db.collection1.aggregate([{"$lookup":{
"from": "collection2", # other table name
"localField": "code", # key field in collection 2
"foreignField": "code", # key field in collection 1
"as": "linked_collections" # alias for resulting table
}},
{"$project": {"code": 1, "field_from_collection1": 1, "field_from_collection2": 1}}
])
#$project is to select fields we need, we could ommit it
for doc in docs:
print(doc)