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"
}
}
すべての例では、括弧内のパラメータを持っていると方向を含め、オーダー(「タイトル」、「ASC」)のような - あなたはそれを試してみましたか?また、予測を含まない場合は、順序が正しいですか? –
@AsyaKamsky:うん、私は括約の有無にかかわらず、方向性があってもなくても試みました。私は基準に 'order'を追加しようとしました。例: 'criteria = criteria.order(" order ")'ソート順は 'projections'なしで終わると正しいので、MongoDBで' projections 'を使用することに特有の問題だと思われます。 –
基準戻り値 'ids'にあるIDのソート順は何ですか? 'projection {id()}'を変更すると、何が変わるのですか? 'projections {property( 'id')}' – matcauthon