2013-09-04 3 views
0

Я ноб на Python и MongoDB и буду очень благодарен за вашу помощь в решении моей проблемы. Моя коллекция в MongoDB выглядит следующим образом:Как добавить данные в (сильно) вложенную коллекцию в MongoDB

{ 
"Segments" : [ 
       { 
        Devices : [ 
           "IP" : "", 
           "Interfaces" : 
              [ 
               { 
               "Name" :"" 
               } 
              ], 
          ], 
          "DeviceName" : "", 
          "SegmentName" : "" 
       } 
       ] 
} 

У меня есть объект, например, так:

Node Details: {'node:98a': ['Sweden', 'Stockholm', '98a-3470'], 'node:98b': ['Denmark', 'Copenhagen', '98b-3471', '98b-3472']} 

мне нужно обновить «Имя» в пределах части «Интерфейсы» в вышеприведенном коллекции со значениями из словарь сведений о узле. Я пробовал использовать $ set, $ addToSet, $ push и т. Д., Но ничего не помогает. Я уже добавил информацию о сегменте и DeviceName.

Вывод должен выглядеть следующим образом:

{ 
    "Segments" : [ 
        { 
         Devices : [ 
            { 
            "Interfaces" : 
               [ 
                { 
                "Name" :"98a-3470" 
                } 
               ], 
            "DeviceName" : "node:98a", 
            } 
            { 
            "Interfaces" : 
               [ 
                { 
                "Name" :"98b-3471" 
                }, 
                { 
                "Name" :"98b-3472" 
                } 
               ], 
            "DeviceName" : "node:98b", 
            } 
           ],         
         "SegmentName" : "segmentA" 
        } 
        ] 
    } 

Любая помощь будет принята с благодарностью. Я много пробовал в оболочке MongoDB, а также в Google, но безрезультатно. Спасибо вам всем.

С уважением, trupsster

[[РЕДАКТИРОВАНИЕ]] Хорошо, вот что у меня до сих пор после продолжая копаться после постановки вопроса: я использовал следующий запрос в MongoDB оболочки:

db.test.mycoll.update({'Segments.SegmentName':'segmentA','Segments.Devices.Name':'node:98a'}, {$set: {"Segments.$.Devices.0.Interfaces.Name" : "98b-3470"}}) 

Теперь это вставлено в нужное место в соответствии с моей «схемой», но когда я пытаюсь добавить второй интерфейс, он просто заменяет предыдущий. Я попытался использовать $ push (жаловался, что он не является массивом), и $ addToSet (показал еще одну ошибку), но никто не помог. Не могли бы вы помочь мне с этого момента?

Спасибо, trupsster

[[Отредактированные снова]]

Я нашел решение! Вот что я сделал: Чтобы добавить интерфейс к существующему устройству:

Теперь, чтобы добавить в Словаре с новой «Имя» в массиве «Интерфейсы»:

db.test.mycoll.update({'Segments.SegmentName':'segmentA','Segments.Devices.Name':'node:98a'}, {$addToSet: {"Segments.$.Devices.0.Interfaces" : {"Name" : "98a-3472"}}}) 

Как вы можете видеть, я использовал $ addToSet.

Теперь следующий шаг должен был добавить ту же информацию (с различными значениями) для 2-го устройства, которое было сделано так:

db.test.mycoll.update({'Segments.SegmentName':'segmentA','Segments.Devices.Name':'node:98b'}, {$addToSet: {"Segments.$.Devices.1.Interfaces" : {"Name" : "98b-3473"}}}) 

Так что это было! Я так нахмурился! Спасибо всем, кто нашел время, чтобы прочитать мою проблему. Надеюсь, мое решение поможет кому-то.

С уважением, trupsster

ответ

0

Вы не сказали, что вы на самом деле пытался. Чтобы получить доступ к суб-документу внутри массива, вам необходимо использовать точечную нотацию с числовыми индексами. Поэтому, чтобы обратиться к полю Name в вашем примере:

Segments.Devices.0.Interfaces.0.Name 

Вы попробовали? Это работает?

+0

Привет, drmirror, извините, я думал, что мое описание проблемы слишком долго, поэтому не добавило утомительного, нерабочего заявления, которое я пробовал. Ваше решение будет работать, я думаю, если бы имя тоже было массивом, но это не так, это dict. Я нашел решение и надеюсь, что это поможет кому-то. Спасибо, что нашли время, чтобы предложить возможное решение! – trupsster

Смежные вопросы