2013-06-25 8 views
9

"n"個のキャンプがあり、キャンプには "インストラクター"があり、インストラクターには "クラス"があるドキュメント "所有者"があります。以前は、ネストされた配列でこれを達成しようとしましたが(下の記事へのリンクを参照)、位置演算子 "$"はその深みを入れ子にしていません。 MongoDB: Adding an array into an existing arrayMongoDb:追加オブジェクトをオブジェクトコレクションに挿入するにはどうすればよいですか?

ただし、回避策は配列の代わりにオブジェクトコレクションを使用することであることを知りました。私は追加の "キャンプ"を追加するために "update"を "$ set"で使用しなければならないと仮定していますが、挿入する前のキャンプを上書き(更新)するたびに実行します。私はまた、次のことをしようとしている

owner = { 

    firstName: 'john', 
    lastName: 'smith', 
    ownerEmail: '[email protected]', 

    camps : { 

     { 
      name: 'cubs-killeen', 
      location: 'killeen' 
     }, 

     { 
      name: 'cubs-temple', 
      location: 'temple' 
     }, 

     instructors : { 

      { 
       firstName: 'joe', 
       lastName : 'black' 
      }, 

      { 
       firstName: 'will', 
       lastName : 'smith' 
      }   
     } 

    } 

} 

以下は、私が達成しようとしている階層構造である

db.owners.update({ownerEmail:'[email protected]'}, {$set: { camps:{ {name:'cubs-killeen'} } }}) 

が、これは予想外の識別子{エラーをスローします。

上記の構造を達成するためのいくつかのサンプルmongoコマンドに関する助けがあれば、最も感謝します。

V/R

クリス

+1

これらは有効な書類ではありません。あなたは 'キャンプ'と 'インストラクター'と一緒にしようとしているように、名前のないネストされたオブジェクトを持つことはできません。 – JohnnyHK

+1

キャンプ:{{名前: '子キルン'}} 'の代わりに'キャンプ:{名前: '子キルン'} 'を意味しましたか? –

+0

@Relfor、はい、それは私が意味するものです!明確化のためにありがとう。さて、どのようにその文書構造を達成するには? – cpeele00

答えて

18

言及した他は、あなたが望む構造は有効ではありません。 私はあなたの所有者ドキュメントについては、以下の構造をお勧めします。

これを持っ
{ 
    "_id" : ObjectId("51c9cf2b206dfb73d666ae07"), 
    "firstName" : "john", 
    "lastName" : "smith", 
    "ownerEmail" : "[email protected]", 
    "camps" : [ 
      { 
        "name" : "cubs-killeen", 
        "location" : "killeen" 
      }, 
      { 
        "name" : "cubs-temple", 
        "location" : "temple" 
      } 
    ], 
    "instructors" : [ 
      { 
        "firstName" : "joe", 
        "lastName" : "black" 
      }, 
      { 
        "firstName" : "will", 
        "lastName" : "smith" 
      } 
    ] 
} 

、その後

db.stack.update(
    { ownerEmail: "[email protected]" }, 
    { 
    $push: { 
     camps: { name: "cubs-killeen", location: "some other Place" } 
    } 
    } 
); 

、あなたはこのようにキャンプを追加することができます。

はそれがお役に立てば幸いです。

+0

ええと、私はどのように教官とキャンプを結びつけるのですか?そしてインストラクターとのクラス(異なるインストラクターは異なるクラスを教えるので)?このアプローチは、Mongoのリッチドキュメントのメリットからの道をはかります。たぶん、私はモンゴースを使って、これをリレーショナルな方法で設計するべきです。返信ありがとう:-) – cpeele00

+2

キャンプには複数のインストラクターがいますか?その場合、「キャンプ」の各キャンプ内に「インストラクター」リストを置くだけです。 '' Joe Black "、" Will Smith "、" Some Other "]'のような単純な文字列を '' instructors ''にすることができます。インストラクターに関する詳細情報を保存したい場合は、新しいインストラクター「インストラクター」を作成し、その名前をIDにしてください。 '{" _id ":"ジョーブラック "、"年齢 ":21、"電話 ":" 123 "}'リレーショナルについて考える前に、シンプルさとデータにどのように照会するかを考えてみてください。 NoSQL(NoRelational)はあなたの心をつかむのが難しいですが、あなたがしたときに返済します。 – AntonioOtero

関連する問題