MongoDB -集約フレームワーク-シリーズ



イントロノート
ご存知のように、システムを設計することはデータを形作ることです.
あなたはそれを正確にどのようにデータを形成する能力を容易にするツールが必要です.

このシリーズの別の例を試してみましょう.
あなたが音楽アーティストのコレクションを持っていると仮定します
  • 誰がアルバムタイトルのarrを持っている
  • 歌の曲名がある
  • どのようにネストされたレベルarr
  • と特定のマッチのためのフィルタ.
    たとえば、すべてのアーティストには、それの中で「獣」という語を持つ歌タイトルがあります.
  • また、我々は曲のリストだけではありません.
  • 我々は、その基準と一致する曲のタイトルを持っている貴族の完全なセットを取得したい、プラスの用語の検索を含む一致する曲のタイトルのarr.
  • /*
    @datamodel
    [
     {
      artist: "",
      bio: "",
      genre: [],
      albums: [
       {
        albumTitle: ""
        songTitles: [
         {
          song: ""
         }
        ]
        }
       ]
      }
     ]
    
    */
    
    
    このテスト例では、テスト結果セットを小さくし、最初の5つの結果だけを検索し、戻りフィールド(投影フィールド)をアーティストとSearchResultフィールドだけに制限します.
    
    const searchTerm = "beast";
    const regex = new RegExp(`${searchTerm}`, "i");
    
    //albumSongs by regex
    lpromiseStringify(
      mgArr(dbEnum.nlpdb, collEnum.songsColl,
        copyField("searchResult", "albums"),
        unwindArr("searchResult"),
        unwindArr("searchResult.albumSongs"),
        matchRegex("searchResult.albumSongs.song", regex),
        limit(5),
        projectIncludeNoId("artist", "searchResult"),
      )
    );
    
    
    /*
    
    @output
    
    [
      {
        "artist": "Peter, Paul & Mary",
        "searchResult": {
          "albumTitle": "album: A Holiday Celebration (1988)",
          "albumSongs": {
            "song": "The Friendly Beasts"
          }
        }
      },
      {
        "artist": "Peabo Bryson",
        "searchResult": {
          "albumTitle": "album: Through The Fire (1994)",
          "albumSongs": {
            "song": "Beauty And The Beast"
          }
        }
      },
      {
        "artist": "Fugees",
        "searchResult": {
          "albumTitle": "album: The Score (1996)",
          "albumSongs": {
            "song": "The Beast"
          }
        }
      },
      {
        "artist": "Classified",
        "searchResult": {
          "albumTitle": "album: Tomorrow Could Be The Day Things Change (2018)",
          "albumSongs": {
            "song": "Beastie Boy"
          }
        }
      },
      {
        "artist": "John Anderson",
        "searchResult": {
          "albumTitle": "album: Goldmine (2015)",
          "albumSongs": {
            "song": "Louisiana Son Of A Beast"
          }
        }
      }
    ]
    
    */
    

    ノート
  • この機能のいくつかは、このシリーズの最初の記事で説明されているので、最初にその記事を読むこと自由に感じなさい.
  • 検索用語は動的に来るので、実行時に文字列を正規表現に変換しなければなりません.
  • lpromiseStringifyはLPromiseのようなものです(約束をログに記録します).しかし、最初に文字列を切り詰めると、ログ出力にネストされたarrsとobjsを完全にログ出力できます.
  • CopyFieldは$ addFieldコマンドのラッパです.この場合、それはフィールド「アルバム」のコピーを作成して、新しくコピーされたフィールド「SearchResult」を呼びます
    他のユースケースには$ addFieldが使用されていますので、今後はそれについてお話します.
    私たちは、アルバムを最初にコピーする必要があります.なぜなら、私たちのスペックによって、私たちは呼び出し元に完全なアルバムセットを返したいからです.
    それの新しいコピーは、検索用語を含む結果だけにフィルタダウンされることによって変異されます.
  • アルバムフィールドのコピー(アルバムのarr)を持っているので、私たちは$ unwindと呼ばれる強力なコマンドを適用します.私のラッパーfuncはunwindarrと呼ばれています.func nameの末尾の“arr”は、このコマンドがタイプARRのフィールドでのみ動作することを思い出させるものです.
    それはフラットのようです.それはARRの各々のELEMのために新しいルート文書をつくります.したがって、アーティストが5枚のアルバムを持っているならば、我々は現在アルバム分野によって異なる5つのアーティスト・オブジェクトを持っています.
    入れ子になったループを行う方法です.
    それは非常に有用な、人気のある、強力なコマンドです.あとでもっと話をします.
  • ドット表記で注意してください.私たちが望むデータに到達するまでネストしたARRSに穴をあけ続けることができます.
  • ネストされたARRSは展開されています(または平坦化されています)、OBJなどのOBJでOBJになりますので、値をドット表記でアクセスすることができます(明示的なループはありません)
    Matchregex ("searchresults . albumsong . song ", regex )
  • 「ProjectInclude」funcを使用すると、明示的に列挙されたものを除くすべてのフィールドが自動的に除外されます.
    フレームワークがデフォルトで含むPK(primary key)を除くFunc Forceのこの変形の一部の“noid”部分.
    あなたの生産質問において、あなたはPKを通常含むでしょう、しかし、私がPKがテストしているものの一部でないとき、私はテストのためにこの「NOID」変種を使用します.それは、そのノイズを削除します.

  • 次は何
    何か不明であれば、何か質問があれば、知らせてください.
    今後は、このデータ整形システムを構成するユーティリティとラッパー機能に、より多くのものを得ることになります.それらのほとんどは単純なonelinersです.

    資源
    arr、obj、elem、funcのようないくつかの省略形を使用することに気づくでしょう.
    リストは以下の通りです.
    addfieldコマンド
    https://docs.mongodb.com/manual/reference/operator/aggregation/addFields
    アンンドコマンド
    https://docs.mongodb.com/manual/reference/operator/aggregation/unwind