0

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

我需要使用节点详细信息字典中的值更新上述集合中“接口”部分中的“名称”。我尝试过使用 $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 上尝试了很多,但无济于事。谢谢你们。

问候, 骗子

[[ EDITED ]] 好的,这是我在提出问题后继续闲逛后所得到的:我在 MongoDB shell 中使用了以下查询:

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

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

谢谢,骗子

[[再次编辑]]

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

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

现在,用数组“接口”中的新“名称”附加到字典:

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"}}})

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

问候, 骗子

4

1 回答 1

0

你没有说你实际尝试了什么。要访问数组内的子文档,您需要使用带数字索引的点表示法。因此,要解决示例中的 Name 字段:

Segments.Devices.0.Interfaces.0.Name

你试过吗?它有效吗?

于 2013-09-04T17:10:07.167 回答