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