マングース101:サブドキュメントの操作


あなたはどのように基本的なレベルで、作成、読み取り、更新、およびドキュメントを削除するmongooseを使用する方法を学んだprevious tutorial . このチュートリアルでは、サブドキュメントにさらに一歩進みます

サブドキュメントとは


マングースにおいては、他の文書にネストした文書がある.スキーマが別のスキーマに入れ子になったときにサブドキュメントを見つけることができます.
注:MongoDBはサブドキュメントを埋め込みドキュメントを呼び出します.
const childSchema = new Schema({
  name: String
});

const parentSchema = new Schema({
  // Single subdocument
  child: childSchema,

  // Array of subdocuments
  children: [childSchema]
});
実際には、別のを作成する必要はありませんてchildSchema 上記の例のように.マングースは、別のオブジェクトにオブジェクトをネストするときにネストしたスキーマを作成するのに役立ちます.
// This code is the same as above
const parentSchema = new Schema({
  // Single subdocument
  child: { name: String },

  // Array of subdocuments
  children: [{ name: String }]
});

属性スキーマの更新


龍という文字を作りたいとしましょう.竜には3つの特別な動きがある.
  • ハドケン
  • 新竜建
  • 辰牧専化学
  • 劉にも一つの究極の動きがある.
  • 申飛憲
  • 我々は、各移動の名前を保存します.また、その移動を実行するために必要なキーを保存します.
    ここで、各移動はサブドキュメントである.
    const characterSchema = new Schema({
      name: { type: String, unique: true },
      // Array of subdocuments
      specials: [{
        name: String,
        keys: String
      }]
      // Single subdocument
      ultimate: {
        name: String,
        keys: String
      }
    })
    
    必要に応じてChildSchema構文を使用することもできます.これは、文字スキーマを理解しやすくなります.
    const moveSchema = new Schema({
      name: String,
      keys: String
    });
    
    const characterSchema = new Schema({
      name: { type: String, unique: true },
      // Array of subdocuments
      specials: [moveSchema],
      // Single subdocument
      ultimate: moveSchema
    });
    

    サブドキュメントを含むドキュメントの作成


    サブドキュメントを含むドキュメントを作成するには、次の2つの方法があります.
  • 入れ子になったオブジェクトをnew Model
  • 作成されたドキュメントにプロパティを追加します.
  • 方法1 :オブジェクト全体を渡す


    このメソッドでは、Loveの名前とその動きの両方を含む入れ子オブジェクトを構築します.
    const ryu = {
      name: "Ryu",
      specials: [
        {
          name: "Hadoken",
          keys: "↓ ↘ → P"
        },
        {
          name: "Shoryuken",
          keys: "→ ↓ ↘ → P"
        },
        {
          name: "Tatsumaki Senpukyaku",
          keys: "↓ ↙ ← K"
        }
      ],
      ultimate: {
        name: "Shinku Hadoken",
        keys: "↓ ↘ → ↓ ↘ → P"
      }
    };
    
    そして、このオブジェクトをnew Character .
    const char = new Character(ryu);
    const doc = await char.save();
    console.log(doc);
    

    方法2 :後にサブドキュメントを追加する


    このメソッドでは、new Character ファースト.
    const ryu = new Character({ name: "Ryu" });
    
    次に、文字を編集して特殊な動きを追加します.
    const ryu = new Character({ name: 'Ryu' })
    const ryu.specials = [{
      name: 'Hadoken',
      keys: '↓ ↘ → P'
    }, {
      name: 'Shoryuken',
      keys: '→ ↓ ↘ → P'
    }, {
      name: 'Tatsumaki Senpukyaku',
      keys: '↓ ↙ ← K'
    }]
    
    それから、我々は最終的な動きを加えるために性格を編集します:
    const ryu = new Character({ name: 'Ryu' })
    
    // Adds specials
    const ryu.specials = [{
      name: 'Hadoken',
      keys: '↓ ↘ → P'
    }, {
      name: 'Shoryuken',
      keys: '→ ↓ ↘ → P'
    }, {
      name: 'Tatsumaki Senpukyaku',
      keys: '↓ ↙ ← K'
    }]
    
    // Adds ultimate
    ryu.ultimate = {
      name: 'Shinku Hadoken',
      keys: '↓ ↘ → ↓ ↘ → P'
    }
    
    一度満足してryu , 我々は走るsave .
    const ryu = new Character({ name: 'Ryu' })
    
    // Adds specials
    const ryu.specials = [{
      name: 'Hadoken',
      keys: '↓ ↘ → P'
    }, {
      name: 'Shoryuken',
      keys: '→ ↓ ↘ → P'
    }, {
      name: 'Tatsumaki Senpukyaku',
      keys: '↓ ↙ ← K'
    }]
    
    // Adds ultimate
    ryu.ultimate = {
      name: 'Shinku Hadoken',
      keys: '↓ ↘ → ↓ ↘ → P'
    }
    
    const doc = await ryu.save()
    console.log(doc)
    

    配列サブドキュメントの更新


    サブドキュメントを更新する最も簡単な方法は以下の通りです.
  • 用途findOne 文書を見つける
  • 配列を取得する
  • 配列を変更する
  • ランsave
  • 例えば、私たちはJodan Sokutou Geri 龍の特別な動きに.キーJodan Sokutou Geri are ↓ ↘ → K .
    第一に、私たちはfindOne .
    const ryu = await Characters.findOne({ name: "Ryu" });
    
    マングース文書は、通常のJavaScriptオブジェクトのように振る舞う.我々は得ることができますspecials 執筆する配列ryu.specials .
    const ryu = await Characters.findOne({ name: "Ryu" });
    const specials = ryu.specials;
    console.log(specials);
    

    このspecials arrayは通常のJavaScript配列です.
    const ryu = await Characters.findOne({ name: "Ryu" });
    const specials = ryu.specials;
    console.log(Array.isArray(specials)); // true
    
    私たちはpush 新しい項目を追加する方法specials ,
    const ryu = await Characters.findOne({ name: "Ryu" });
    ryu.specials.push({
      name: "Jodan Sokutou Geri",
      keys: "↓ ↘ → K"
    });
    
    更新後specials , 我々は走るsave をデータベースに保存します.
    const ryu = await Characters.findOne({ name: "Ryu" });
    ryu.specials.push({
      name: "Jodan Sokutou Geri",
      keys: "↓ ↘ → K"
    });
    
    const updated = await ryu.save();
    console.log(updated);
    

    単一のサブドキュメントの更新


    単一のサブドキュメントを更新するのも簡単です.通常のオブジェクトのように直接ドキュメントを編集できます.
    私たちは龍の究極の名前を新ku HadokenからDejin Hadokenに変えたいと言いましょう.私たちがすることは
  • 用途findOne 龍を得る.
  • 変更するname インultimate
  • ランsave
  • const ryu = await Characters.findOne({ name: "Ryu" });
    ryu.ultimate.name = "Dejin Hadoken";
    
    const updated = await ryu.save();
    console.log(updated);
    

    読書ありがとう.この記事はもともと投稿されたmy blog . あなたがより良いフロントエンド開発者になるために、より多くの記事が欲しいならば、私の会報にサインアップしてください.