Python — %s должен быть экземпляром dict, bson.son .Запрос СЫНА из MongoDB

#python #mongodb #mongodb-query

#python #mongodb #mongodb-запрос

Вопрос:

Я пытаюсь выполнить выбор в базе данных mongodb с помощью python.

Если я извлеку все документы из коллекции, это сработает:

      mongo_docs = instance_col.find()
 

instance_col это мой столбец в mongodb.

Однако мне нужно запросить конкретный номер учетной записи AWS, и именно здесь он разваливается.

Если я сделаю:

     query = "Account Number : "    aws_account_number
    mongo_docs = instance_col.find({query})
 

Мой скрипт выходит из строя:

 Traceback (most recent call last):
  File ".aws_ec2_list_instances.py", line 766, in <module>
    main()
  File ".aws_ec2_list_instances.py", line 639, in main
    mongo_export_to_file(interactive, aws_account, aws_account_number)
  File "C:Userstdun0002OneDrive - Company TechnologiesDesktopimportant_foldersCompanygitjf_cloud_scriptsaws_scriptspythonaws_toolsec2_mongo.py", line 223, in mongo_export_to_file
    mongo_docs = instance_col.find({query})
  File "C:Userstdun0002AppDataLocalProgramsPythonPython38-32libsite-packagespymongocollection.py", line 1460, in find
    return Cursor(self, *args, **kwargs)
  File "C:Userstdun0002AppDataLocalProgramsPythonPython38-32libsite-packagespymongocursor.py", line 143, in __init__
    validate_is_mapping("filter", spec)
  File "C:Userstdun0002AppDataLocalProgramsPythonPython38-32libsite-packagespymongocommon.py", line 472, in validate_is_mapping
    raise TypeError("%s must be an instance of dict, bson.son.SON, or "
TypeError: filter must be an instance of dict, bson.son.SON, or any other type that inherits from collections.Mapping
 

Вот как выглядят записи в моей базе данных mongo:

 { "_id" : ObjectId("5ff32fe910541fea330a59b3"), "AWS Account" : "company", "Account Number" : "012345678910", "Name" : "B-product--antispam-d984", "Instance ID" : "i-xxxxxxxxxxxxxxxxx", "AMI ID" : "ami-xxxxxxxxxxxxxxxxxx", "Volumes" : "vol-xxxxxxxxxxxxxxxxxxxx, vol-0d469d1595f99b81c", "Private IP" : "10.245.137.140", "Public IP" : null, "Private DNS" : "ip-10-245-137-140.ec2.internal", "Availability Zone" : "us-east-1b", "VPC ID" : "vpc-xxxxxxxxxxxxxxxxxxx", "Type" : "t3.medium", "Key Pair Name" : "amp-company-dept-dev", "State" : "running", "Launch Date" : "November 23 2020" }
{ "_id" : ObjectId("5ff32fe910541fea330a59b5"), "AWS Account" : "company", "Account Number" : "012345678910", "Name" : "B-product--staticweb-a52f", "Instance ID" : "i-xxxxxxxxxxxxxxxxx", "AMI ID" : "ami-xxxxxxxxxxxxxxxxxx", "Volumes" : "vol-xxxxxxxxxxxxxxxxxxxx, vol-01163ccf4372cf0aa", "Private IP" : "10.245.137.233", "Public IP" : null, "Private DNS" : "ip-10-245-137-233.ec2.internal", "Availability Zone" : "us-east-1b", "VPC ID" : "vpc-xxxxxxxxxxxxxxxxxxx", "Type" : "t3.medium", "Key Pair Name" : "amp-company-dept-dev", "State" : "running", "Launch Date" : "November 23 2020" }
{ "_id" : ObjectId("5ff32fe910541fea330a59b7"), "AWS Account" : "company", "Account Number" : "012345678910", "Name" : "B-product--campaigns-f08a", "Instance ID" : "i-xxxxxxxxxxxxxxxxx", "AMI ID" : "ami-xxxxxxxxxxxxxxxxxx", "Volumes" : "vol-xxxxxxxxxxxxxxxxxxxx, vol-08d5b9114fe5b538a", "Private IP" : "10.245.137.176", "Public IP" : null, "Private DNS" : "ip-10-245-137-176.ec2.internal", "Availability Zone" : "us-east-1b", "VPC ID" : "vpc-xxxxxxxxxxxxxxxxxxx", "Type" : "t3.medium", "Key Pair Name" : "amp-company-dept-dev", "State" : "running", "Launch Date" : "November 23 2020" }
 

Как я могу сделать это правильно?

Комментарии:

1. Да, это то, что я пытаюсь запросить.

Ответ №1:

В сообщении об ошибке сообщается, что find ожидается dict или другое сопоставление. Однако вы передали набор. Попробуйте это вместо:

 instance_col.find({"Account Number": aws_account_number})