【问题标题】:How to add data to a (heavily) nested collection in MongoDB如何将数据添加到 MongoDB 中的(大量)嵌套集合
【发布时间】:2013-09-04 16:09:00
【问题描述】:

我是 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 上尝试了很多,但无济于事。谢谢大家。

问候, 支持者

[[已编辑]] 好的,这是我在提出问题后继续闲逛后所得到的:我在 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"}}})

原来如此!我对自己很满意!感谢所有花时间阅读我的问题的人。我希望我的解决方案能对某人有所帮助。

问候, 支持者

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

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

    Segments.Devices.0.Interfaces.0.Name
    

    你试过了吗?有用吗?

    【讨论】:

    • 您好 drmirror,对此感到抱歉,我认为我的问题描述太长,因此没有添加我尝试过的乏味、无效的声明。我想,如果 Name 也是一个数组,你的解决方案会起作用,但它不是,它是 dict。我现在已经找到了解决方案,并希望它会帮助某人。感谢您抽出宝贵时间提出可能的解决方案!
    猜你喜欢
    • 2015-02-07
    • 2022-01-20
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多