1

私は現在 MongoDB を学んでいますが、いくつか問題があります。

プロジェクトでは、SQL を使用していて、Artist、Album、Song の 3 つのテーブルがありました。

それから、行がたくさんあり、また興味があったので、Mongoに変更することにしました...

Mongo では、すべてを含むコレクションソングが 1 つしかありません。

  • トラック名
  • アーティスト名
  • アートワーク
  • フォルダ
  • アルバム名
  • アルバムの日付

まず、この構造が正しいかどうか、または SQL にあった各テーブルのコレクションを作成する必要があるかどうかを知りたいですか? 私の主な目的は、artistName="something" および trackName="something_else" を検索できるようにすることです...単純な検索で、非常に高速に動作します! :)

ただし、すべてのアーティストをリンク (フォルダー) とともに表示するページも必要です。ここに私の問題があります: すべてのアーティストを表示し、artistName の順序で A (たとえば) で始まり、各アーティストのフォルダーを取得します。 ..

私はこれを試しました:

$cursor =$collection->distinct("artistName", array( "artistName" => $regex));

それはうまくいきますが、..が必要folderです

それから私はこれを試しました:

$ops = array(
    array(
        '$project' => array(
            "artistName" => 1,
            "folder"   => 1,
        )
    ),
    array('$match' => array( "artistName" => $regex)),
    array('$group' => array(
                        '_id'=>'$artistName',
                        "artistName" => array('$first' => '$artistName'),
                        "folder" => array('$first' => '$folder')
                        ),
    array('$sort' => array('artistName'=>-1)),
    )
);

$results = $collection->aggregate($ops);

それは並べ替えなしで機能しますが、並べ替えを使用すると次のエラーが発生します。

Pipeline::run(): unrecognized pipeline op "0'

だから私の質問は、私が必要とすることを行うための最良の方法は何ですか?

どうもありがとう、バレンティン

4

1 に答える 1

1

構造は良好です。この場合、単純さは良いことです。mongodbでdmを設計する方法のチュートリアルをここで確認できます。あなたが書いた提案では、集約フレームワークを選択します。あなたが書いた構文では、問題の原因となったエラーがあり、$groups配列のブラケット内に$sortを記述しました。これを試して:

$ops = array(
    array('$project' => array(
                          "artistName" => 1,
                          "folder"   => 1,
                          )
         ),
    array('$match' => array( "artistName" => $regex)),
    array('$group' => array(
                        '_id'=>'$artistName',
                        "artistName" => array('$first' => '$artistName'),
                        "folder" => array('$first' => '$folder')
                        )
         ),
    array('$sort' => array('artistName'=>-1))
    );

そこには少し概念的な誤りもあります。関係が多対多であるため、フォルダとアーティストの間の構造は、アーティストが一致する最初のフォルダのみを提供すると思います。また、 "artistName" => array('$ first' =>'$ ArtistsName')ですが、artistNameを含む別のフィールドが好きだったと思いますが、これは_idと同じです。グループ演算子では、SQLのGROUPBYフィールドとしてgourping関数のキーに関連する_idを配列します。ここで動作を確認できます。

あなたの場合、私は以下を使用します:

$ops = array(
    array('$match' => array( "artistName" => $regex)),
    array(
        '$project' => array(
            "artistName" => 1,
            "folder"   => 1,
        )
    ),
    array('$group' => array(
                        '_id'=>array('artistName' => '$artistName', 
                                     'folder' => '$folder')
                        )),
    array(
        '$project' => array(
            "_id" => 0,
            "artistName" => '$_id.artistName',
            "folder"   => '$_id.folder',
        )
    ),
    array('$sort' => array('artistName'=>-1))
);
于 2013-02-04T06:13:40.453 に答える