Python Pymongo在子文档中查找值

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

我正在使用MongoDB 4和Python 3。我有三个收藏。第一个集合在其他集合上有2个引用字段

示例:

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个查询,我想用一个查询来比较谁更快