Python Pymongo在子文档中查找值
我正在使用MongoDB 4和Python 3。我有三个收藏。第一个集合在其他集合上有2个引用字段 示例:Python Pymongo在子文档中查找值,python,mongodb,pymongo,Python,Mongodb,Pymongo,我正在使用MongoDB 4和Python 3。我有三个收藏。第一个集合在其他集合上有2个引用字段 示例: User { _id : ObjectId("5b866e8e06a77b30ce272ba6"), name : "John", pet : ObjectId("5b9248cc06a77b09a496bad0"), car : ObjectId("5b214c044ds32f6bad7d2"), } Pet { _id : ObjectId("5
User {
_id : ObjectId("5b866e8e06a77b30ce272ba6"),
name : "John",
pet : ObjectId("5b9248cc06a77b09a496bad0"),
car : ObjectId("5b214c044ds32f6bad7d2"),
}
Pet {
_id : ObjectId("5b9248cc06a77b09a496bad0"),
name : "Mickey",
}
Car {
_id : ObjectId("5b214c044ds32f6bad7d2"),
model : "Tesla"
}
所以一个用户有一辆车和一只宠物。我需要查询用户集合,找出是否有一个用户有一个名为“米奇”的宠物和一辆型号为“特斯拉”的汽车
我试过这个:
db.user.aggregate([{
$project : {"pet.name" : "Mickey", "car.model" : "Tesla" }
}])
但是它返回了很多数据,而我只有一个包含这些数据的文档。我做错了什么?您需要在此处使用聚合
像这样的
db.users.aggregate([
{ "$lookup": {
"from": Pet.collection.name,
"let": { "pet": "$pet" },
"pipeline": [
{ "$match": { "$expr": { "$eq": ["$_id", "$$pet"] }, "name" : "Mickey"}}
],
"as": "pet"
}},
{ "$lookup": {
"from": Car.collection.name,
"let": { "car": "$car" },
"pipeline": [
{ "$match": { "$expr": { "$eq": ["$_id", "$$car"] }, "model" : "Tesla"}}
],
"as": "car"
}},
{ "$match": { "pet": { "$ne": [] }, "car": { "$ne": [] } }},
{ "$project": { "name": 1 }}
])
@AnthonyWinzlet发布的答案有一个缺点,那就是它需要翻阅用户集合中的所有文档,并执行
$lookup
s,这相对来说成本较高。因此,根据用户集合的大小,这样做可能会更快:
将索引放在users.pet
和users.car
:db.users.createIndex({pet:1,car:1})
将索引放在cars.model
:db.cars.createIndex({model:1})
将索引放在pets.name
:db.pets.createIndex({name:1})
然后,您可以简单地执行以下操作:
获取所有匹配的“特斯拉”
汽车的列表:db.cars.find({model:“特斯拉”})
获取所有匹配的“Mickey”
宠物的列表:db.pets.find({name:“Mickey”})
查找您感兴趣的用户:db.users.Find({car:{$in:[]},pet:{$in:[]})
这很容易阅读和理解,而且所有三个查询都完全由索引覆盖,因此可以期望它们能以最快的速度完成。预期的输出应该是什么?我只想知道我的收藏中是否存在该文档。但是输出可以只是一个布尔值,也可以是所有用户属性,因为它可以工作。但是查询速度很慢:/。有没有办法加快速度?例如,如果文档存在或不存在,只返回一个布尔值。我尝试了使用和不使用unwind我得到了相同的结果,除了没有查询是快速的你的用户集合有更多的字段吗?如果是,则在此处使用投影($project
),是的,我们可以在此处删除$unwind
阶段。我有9个字段使用投影可能会帮助您。。。没有其他选择你能举个例子吗。我以前已经做过了。我有我所有的索引,我做了3个查询,我想用一个查询来比较谁更快