2016-12-12 3 views
0

У меня есть набор данных, который выглядит следующим образом:Вставка списка объектов в качестве отдельных документов Mongo с PyMongo

[{ 
    "myhost1.com": { 
     "services": [ 
      { 
       "environment": "prod", 
       "__module__": "polling_functions", 
       "serviceName": "service-a", 
       "__class__": "app" 
      } 
     ] 
    }, 
    "myhost2.com": { 
     "services": [ 
      { 
       "environment": "prod", 
       "__module__": "polling_functions", 
       "serviceName": "service-a", 
       "__class__": "db" 
      } 
     ] 
    }, 
    ... 

То, что я хочу сделать, это вставить каждый из них в виде отдельного документа, в моем MongoDB. После чистки клавиш для удаления . символов, я попробовал две вставки:

db.hostuse.insert_many(dataset)

и

for key in dataset[0]: 
    db.hostuse.insert_one(dataset[0][key]) 

Ни один из них сделать то, что я хочу, хотя. Первый вставляет один документ с ключами, являющимися именами хостов. Второй вставляет несколько документов, но без имен хостов; вместо этого каждый ключ равен services.

Как я могу преобразовать этот набор данных, чтобы передать его моему MongoDB, и привести к нескольким документам, каждый с ключом hostname?

ответ

1

Как это:

collection = MongoClient().db.collection 
for hostname, services in dataset[0].items(): 
    collection.insert_one({'hostname': hostname, 
          'services': services}) 

Вы должны вытащить Dict из набора данных [0] и для каждого ключа и значения в Словаре, вставить отдельный документ.

+0

Это в основном работает, но хранить документ как: '{ "_id": ObjectId ("584f175ee281af385ce8a6bc"), "услуги": { "услуги": [ { ... } ] }, "Имя хоста": "myhost1.com" } '- обратите внимание на дублирующие "услуги" ключ/поле. – MrDuk

+0

Для моих целей, поскольку я могу предположить, что в каждом разделе 'host' существует один раздел' services', изменяющий код для использования '({'hostname': hostname, services.keys() [0]: services.values ​​() [0]}) 'работал для меня – MrDuk