我是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
答案 0 :(得分:0)
你没说出你实际尝试过的东西。要访问数组内的子文档,需要使用带有数字索引的点表示法。因此,要解决示例中的“名称”字段:
Segments.Devices.0.Interfaces.0.Name
你试过那个吗?它有效吗?