2016-04-29 6 views
0

私は、単純な文書があります。モンゴDB更新文

/* 1 */ 
{ 
    "_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
    "Settings" : [ 
     [ 
      "Storage", 
      "Dedicated" 
     ], 
     [ 
      "Country", 
      "EE" 
     ], 
     [ 
      "Address", 
      "http://localhost:55557" 
     ], 
     [ 
      "Number", 
      "05" 
     ] 
    ] 
} 

は、スキーマ設計が間違っているhttp://10.10.20.2:66667

+2

このようなスキーマを編集するRoboMongoを使用していますMongoDBではクエリと更新が非常に困難です。埋め込み配列が適切なフィールドと値のペアを持つドキュメントにフラット化されるようにスキーマを変更することを検討してください。 – chridam

+0

chridam-私は適切なフィールド/値のペアでそれを修正することができた場合、私はスキーマを更新できません。私はそれが良いものではないことを知っています。 – vencrena

答えて

3

のようなIPのaddress.somethingにアドレス情報"http://localhost:55557"を更新するための更新文を書く方法を見つけ出すことはできません更新する値のキーがないためです。

{ 
_id : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
settings : 
    { 
     storage:"Dedicated", 
     country:"EE", 
     address:"http://localhost:55557", 
     number:"05" 
    } 
} 

上記のスキーマではなくdouble配列を持つよりも、設定のすべての値のキーを持っているし、次のようにスキーマを変更することを検討してください。上記の文書では、どの値にもアクセス可能で編集可能です。

db.settings.update({ 
    _id: "9cbfceec-d6f6-5638-b7c9-49103dc39665" 
}, { 
    $set: { 
    "settings.address": "http://10.10.20.2:66667" 
    } 
}); 
+0

スキーマが良好であれば、提案されたソリューションが機能するはずです。しかし、それはダブル配列で私の問題を解決しません。スキーマを変更することはできません。 – vencrena

+1

Addressはキーではないので、Addressに直接アクセスする方法はありません。 Addressは配列の最初の要素で、それに関連付けられた値は2番目の値です。そのため、唯一の方法は、ドキュメントを検索し、設定配列を取得し、配列を反復処理しながら文字列比較を実行してアドレスを見つけることです。次に、ドキュメント内の値を更新し、コレクション内のドキュメント全体を更新します。 –

+0

はい私はあなたが提案したモデルをすでに使用していました。もっと簡単にできると思いました。ご協力いただきありがとうございます。 – vencrena

0

chirdamは、スキーマについての権利である、次のようにあなたは、ドキュメントを更新することができます。

あなたは、次の試みることができる、新しいスキーマを作成するための規定を持っていない場合:

この文字列で検索してください:

db.yourCollection.update({"_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", "Settings.Address" : "http://localhost:55557"} , { $set : {"Settings.$.Address" : "http://10.10.20.2:66667"}}); 

または代替の手動あなたのコレクション

+0

私はスキーマについて知っています。あなたの解決策は二重配列なので私の場合は助けにならない。 – vencrena