如何将数据添加到MongoDB中的(重度)嵌套集合中

时间:2013-09-04 16:09:01

标签: python mongodb pymongo

我是Python和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']}

我需要使用Node Details字典中的值更新上面集合中“Interfaces”部分中的“Name”。我尝试过使用$ set,$ addToSet,$ push等,但没有任何帮助。我已经添加了Segment和DeviceName信息。

输出应如下:

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

非常感谢任何帮助。我已经在MongoDB shell和Google上尝试了很多,但无济于事。谢谢大家。

此致 trupsster

[[已编辑]] 好的,这是我在提出问题之后继续讨论之后到目前为止所得到的:我在MongoDB shell中使用了以下查询:

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

现在根据我的'schema'将其插入到正确的位置,但是当我尝试添加第二个界面时,它只是替换了之前的界面。我尝试使用$ push(抱怨它不是一个数组)和$ addToSet(显示另一个错误),但没有帮助。从这一点开始,你能帮助我吗?

谢谢, trupsster

[[再次编辑]]

我找到了解决方案!这是我做的: 要将接口添加到现有设备:

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

现在,在数组'Interfaces'中添加一个新的'Name'来附加到dict:

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

如您所见,我使用了$ addToSet。

现在,下一步是向第二个设备添加相同的信息(具有不同的值),这样做是这样的:

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

就是这样!我对自己很满意!谢谢所有花时间阅读我的问题的人。我希望我的解决方案可以帮助别人。

此致 trupsster

1 个答案:

答案 0 :(得分:0)

你没说出你实际尝试过的东西。要访问数组内的子文档,需要使用带有数字索引的点表示法。因此,要解决示例中的“名称”字段:

Segments.Devices.0.Interfaces.0.Name
你试过那个吗?它有效吗?