2016-11-05 1 views
0

私は、CDに関する情報(アーティスト、アルバムタイトル、リリース年など)を含むシンプルな音楽データベースを持っています。基本的に、私はアーティスト、リリース年(これは簡単です)で私のクエリを並べ替えることができますが、CDにアーティストがいない場合は、ソートしてアルバムタイトルをキーします。次のCDのための例としてMongoDBの複数のフィールドに1つのソートをキーすることはできますか?

、:

> db.music.find() 
{ "_id" : ObjectId("581d3e073a4d1f0d73a8650b"), "Type" : "CD", "Artist" : "Korn", "Title" : "Korn", "ReleaseYear" : 1994 } 
{ "_id" : ObjectId("581d3e283a4d1f0d73a8650c"), "Type" : "CD", "Artist" : "Korn", "Title" : "Life is Peachy", "ReleaseYear" : 1996 } 
{ "_id" : ObjectId("581d3efd3a4d1f0d73a8650d"), "Type" : "CD", "Title" : "Big Daddy", "ReleaseYear" : 1999 } 
{ "_id" : ObjectId("581d3f3c3a4d1f0d73a8650e"), "Type" : "CD", "Title" : "Aerosmith", "ReleaseYear" : 1973, "Artist" : "Aerosmith" } 

私はそれがにソートしたいと思う:ここ

Aerosmith - Aerosmith (1973) 
Big Daddy (1999) 
Korn - Korn (1994) 
Korn - Life is Peachy (1996) 

は、私が試したものです:

> db.music.find().sort({[Artist:1,Title:1],ReleaseYear:1}) 
2016-11-04T22:10:39.317-0400 E QUERY [thread1] SyntaxError: missing ] in computed property name @(shell):1:29 
> db.music.find().sort({[Artist,Title]:1,ReleaseYear:1}) 
2016-11-04T22:10:50.564-0400 E QUERY [thread1] SyntaxError: missing ] in computed property name @(shell):1:29 
> db.music.find().sort({{Artist:1,Title:1},ReleaseYear:1}) 
2016-11-04T22:11:12.040-0400 E QUERY [thread1] SyntaxError: invalid property id @(shell):1:22 

IをCOLLDSortNameフィールドに入力します。このフィールドには、アーティストoタイトルは、文書に直接入れないでください。

答えて

1

大きなデータセットでソートを効率的に行い、OLTPスタイルのワークロードでクエリを処理する場合は、ソート用のインデックスを入れることができるため、マテリアライズドソートキーが最適です。 MongoDBソート演算子は、非定型のユーザー定義のソートキーをネイティブにサポートしていません。

クエリが時間を消費することが大丈夫なら、たとえば分析のために、あなたはMongoDBののaggregation framework、特に、2つの演算子を採用することができます集約パイプラインnull以外の値(最初の引数)を返し

  • $ifNullかに新しいフィールドを作成することができます

    • $project代替表現(第二引数)それらを使用して

    、あなたのソートクエリは以下のように書くことができる

    db.music.aggregate([ 
        { $project: 
        { "Artist": 1, 
         "Title": 1, 
         "ReleaseYear": 1, 
         "SortName": { "$ifNull" : [ "$Artist", "$Title" ] }, 
        } 
        }, 
        { $sort: { "SortName": 1, "ReleaseYear": 1} } 
    ]); 
    

    pipeline stepsを追加することができます。たとえば、最初にデータをフィルタリングします($match)。

  • +0

    これは素晴らしいです!私はどこかに小さな誤りがあるのではないかと心配しています。 'パイプラインステージ指定オブジェクトは正確に1つのフィールドを含む必要があります。' '$ sort:{}'を取り出すと、新しいフィールド 'SortName'で正しいデータセットが得られます。 –

    +0

    ああ、 '$ project'と' $ sort'は集約配列内の別々の要素である必要があります。これで完璧に動作します! –

    関連する問題