2013-11-25 18 views
5

MongoDBを使用すると、投影結果をGrails criteriaにどのように並べるのですか?MongoDBで並べ替え順序を無視したGrails投影

MongoDBでは並べ替えが無視されるようです。以下のコードは、Grailsのデフォルトのメモリ内HSQLDBデータベースを使って実行すると、ソートされた書籍のタイトルのリストを正しく返します。 MongoDBに切り替えるとソートが無視されます。

BookController.groovy

class BookController { 

    def library = [ 
     [author: "Jan", title: "HTML5"], 
     [author: "Lee", title: "CSS3"], 
     [author: "Sue", title: "JavaScript"] 
     ] 

    def titles() { 
     library.each { if (!Book.findByTitle(it.title)) new Book(it).save() } 
     def ids = Book.createCriteria().list() { 
     projections { id() } 
     order "title" 
     } 
     def titles = ids.collect { Book.get(it).title } 
     render titles as JSON 
     } 

} 

デフォルトDB(正しい)との結果:MongoDBの(間違った)と

["CSS3","HTML5","JavaScript"] 

結果:

["HTML5","CSS3","JavaScript"] 

注上記の本その例は問題を説明するための単純なコードです。実際の目標は、ドメインのフィールドでソートされたドメインIDのリストを生成して、ドメインを希望の順序で反復できるようにすることです。

私が扱っている実際のドメインは大きすぎてメモリに収まりません。言い換えれば、これはアプリケーションをクラッシュさせるでしょう:Book.list().title.sort()

以下は、追加の背景情報です。

Book.groovy

class Book {  
    String title 
    String author 
    static mapWith = "mongo" 
} 

BuildConfig.groovy

... 
compile ":mongodb:1.3.1" 
... 

DataSource.groovy

... 
grails { 
    mongo { 
     host = "localhost" 
     port = 27017 
     databaseName = "book-store" 
     } 
    } 
+0

すべての例では、括弧内のパラメータを持っていると方向を含め、オーダー(「タイトル」、「ASC」)のような - あなたはそれを試してみましたか?また、予測を含まない場合は、順序が正しいですか? –

+0

@AsyaKamsky:うん、私は括約の有無にかかわらず、方向性があってもなくても試みました。私は基準に 'order'を追加しようとしました。例: 'criteria = criteria.order(" order ")'ソート順は 'projections'なしで終わると正しいので、MongoDBで' projections 'を使用することに特有の問題だと思われます。 –

+0

基準戻り値 'ids'にあるIDのソート順は何ですか? 'projection {id()}'を変更すると、何が変わるのですか? 'projections {property( 'id')}' – matcauthon

答えて

1

proje 3.0のプラグインでMongoDb集約フレームワークを使用するようにサポートが変更されました。ですから、3.0ではどこで注文しても動作しなくてもよいでしょう。参照してください。私は順序を示す見つけることができますhttps://jira.grails.org/browse/GPMONGODB-305

関連コミットhttps://github.com/grails/grails-data-mapping/commit/1d1155d8a9e29a25413effce081c21a36629137d

+0

これは素晴らしいですが、私はまだそれをテストすることができませんでした。私たちはListフィールドについていくつかの予測を行い、それは明らかにv3.0ではサポートされていません。私たちがv3.0にアップグレードする方法を見つけたら、私はアップデートを投稿します。 –

+0

@Graeme Rocherここでsort => table.find(query).sort({"eventStartsAt":-1})を実行することができませんskip(offset).limit(max) –

関連する問題