Buduję listę wystąpień w Amazon EC2. Mój skrypt działa świetnie, aby umieścić listę w pliku CSV i wysłać go do Ciebie.

Ale teraz chcę wstawić rekordy na MongoDB, aby można było śledzić różnice w środowisku.

Mam funkcję wstawienia rekordów do MongoDB, który wygląda tak:

def insert_col(instance_col,mydict):
    x = instance_col.insert_one(mydict) 
    print(f"MongoDB record inserted: {x.inserted_id}")
    return x

Słownik zwany instance_col, który próbuję wstawić do DB wygląda tak:

{'AWS Account': 'jf-master-pd', 'Account Number': 'xxxxxxxxx', 'Name': 'usawsweb010', 'Instance ID': 'i-0871d82fb5c4e268b', 'AMI ID': 'ami-006219aba10688d0b', 'Volumes': 'vol-047b2ca3dd93b9021, vol-02ea0a81271a00b0b, vol-00abcef2eee9f19de, vol-09222810b7fc52265, vol-03c9a84ee93f81edc', 'Private IP': '172.31.75.47', 'Public IP': 'x.xxx.xxx.xxx', 'Private DNS': 'ip-172-31-75-47.ec2.internal', 'Availability Zone': 'us-east-1f', 'VPC ID': 'vpc-68b1ff12', 'Type': 't2.micro', 'Key Pair Name': 'timd', 'State': 'running', 'Launch Date': 'July 11 2020'}

Jeśli spróbuję użyć funkcji wstaw_col, wstawia pierwszy rekord, daje wyjątek, który mówi:

MongoDB record inserted: 5f0a46f267a8132e4b31e83f
An exception has occurred: dict contains fields not in fieldnames: '_id'

Nie wiem, dlaczego narzeka na mój dykt nie zawierający nazwy polowej o nazwie "_id" po włożeniu rekordu. Program przestaje działać po tym.

To jest pełny Traceback:

  Traceback (most recent call last):
  File ".\aws_ec2_list_instances.py", line 768, in <module>
    main()
  File ".\aws_ec2_list_instances.py", line 632, in main
    output_file = list_instances(aws_account,aws_account_number, interactive, regions, fieldnames, show_details, instance_col)
  File ".\aws_ec2_list_instances.py", line 249, in list_instances
    writer.writerow(instance_dict)
  File "C:\Users\tdun0002\AppData\Local\Programs\Python\Python38-32\lib\csv.py", line 154, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "C:\Users\tdun0002\AppData\Local\Programs\Python\Python38-32\lib\csv.py", line 149, in _dict_to_list
    raise ValueError("dict contains fields not in fieldnames: "
ValueError: dict contains fields not in fieldnames: '_id'

Kiedy dzwonię do funkcji, nazywam to tak: insert_col(instance_col,instance_dict). Jeśli skomentuję go, program idzie wesoły sposób i działa doskonale, jak to zrobiłem, zanim zacząłem małpaskać z MongoDB.

Mam 10 serwerów w tym środowisku, który próbuję wstawić do MongoDB.

Dlaczego to robi i jak mogę wstawić te rekordy do MongoDB?

0
bluethundr 12 lipiec 2020, 02:54

1 odpowiedź

Najlepsza odpowiedź

Spróbuj

from bson.objectid import ObjectId
def insert_col(instance_col,mydict):
    mydict['_id'] = ObjectId() 

    x = instance_col.insert_one(mydict) 
    print(f"MongoDB record inserted: {x.inserted_id}")
    return x


1
InfoLearner 12 lipiec 2020, 00:09