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

上記のコレクションの「Interfaces」部分内の「Name」を、Node Details ディクショナリの値で更新する必要があります。$set、$addToSet、$push などを使用してみましたが、何も役に立ちません。セグメントとデバイス名の情報は既に追加しています。

出力は次のようになります。

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

どんな助けでも大歓迎です。MongoDB シェルと Google でいろいろ試しましたが、うまくいきませんでした。皆さん、ありがとうございました。

よろしく、トラプスター

[[ 編集済み ]] さて、質問を投げかけた後、いろいろ調べてみた結果、これまでに得たものは次のとおりです。MongoDB シェルで次のクエリを使用しました。

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

これは私の「スキーマ」に従って正しい場所に挿入されましたが、2 番目のインターフェイスを追加しようとすると、以前のインターフェイスが置き換えられてしまいます。$push (配列ではないことを訴えた) と $addToSet (別のエラーが表示された) を使用してみましたが、何も役に立ちませんでした。この時点から私を助けてもらえますか?

ありがとう、トラプスター

[[再編集]]

解決策を見つけました!これが私がやったことです: 既存のデバイスにインターフェースを追加するには:

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 を使用しました。

さて、次のステップは、同じ情報 (異なる値を持つ) を 2 番目のデバイスに追加することでした。これは次のように行われました。

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 に答える