2013-11-25 15 views
5

MongoDB kullanırken, Grails criteria projeksiyonlarının sonuçlarını nasıl sipariş edersiniz? MongoDB tarafından sıralama yok sayılıyor gibi görünüyor. Aşağıdaki kod, Grails varsayılan bellek içi HSQLDB veritabanında çalıştırıldığında doğru şekilde sıralanmış kitap başlıklarının bir listesini döndürür. MongoDB'ye geçmek, sıralamanın göz ardı edilmesine neden olur. ileMongoDB ile sıralama düzenini dikkate almayan sınıflandırma projeksiyonları

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 
     } 

} 

Sonucu varsayılan (doğru) DB:

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

Not Yukarıdaki kitap bu: MongoDB (yanlış) ile

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

Sonucu örnek problemi göstermek için sadece önemsiz bir koddur. Asıl amaç, alanın bir alanın sıralamasına göre sıralanmış olan bir alan adı kimlikleri listesi oluşturmaktır, böylece alan, istenen sıraya göre tekrarlanabilir.

Karşılaştığım gerçek etki alanı belleğe sığamayacak kadar büyük. Başka bir deyişle, bu uygulamanın çökmesine neden olur: Book.list().title.sort()

Aşağıda ek arkaplan bilgisi yer almaktadır.

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

Tüm örnekler Pars içinde parametresine sahip ve yönünü, sipariş gibi ("başlığı", "artan") yer alır işlemek - Bunu denediniz mi? Ayrıca, projeksiyon içermediğinizde sipariş doğru mu? –

+0

@AsyaKamsky: Evet, parens olmadan ve olmadan ve yönsüz ve denedim. Ölçütlere "sipariş" eklemeyi bile denedim. Örnek: 'criteria = criteria.order (" order ")' Sıralama 'projeksiyonlar' yapılmadan yapıldığı zaman doğrudur, bu yüzden konuların MongoDB'de 'projeksiyon'ları kullanmaya özgü olduğu görülmektedir. –

+0

İds’lerin ölçüt değerlerindeki ids sıralama düzeni nedir? Projeksiyonları {id()} 'değiştirirseniz herhangi bir şey değişir mi? 'projeksiyonlar {property ('id')}' – matcauthon

cevap

1

proje Eklemenin 3.0 sürümünde MongoDb toplama çerçevesini kullanmak için katyon desteği yeniden yazılmıştır. Yani örnek 3.0 ile sipariş vermeden veya sipariş vermeden çalışmalıdır. Bkz https://jira.grails.org/browse/GPMONGODB-305

İlgili ben sırasını gösteren bulabilirsiniz https://github.com/grails/grails-data-mapping/commit/1d1155d8a9e29a25413effce081c21a36629137d

+0

Bu kulağa harika geliyor, ancak henüz test edemedim. Liste alanlarında birkaç projeksiyon yapıyoruz ve bu v3.0'da desteklenmiyor. V3.0'a yükseltmenin bir yolunu belirlediğimizde, bir güncelleme göndeririz. –

+0

@Graeme Rocher Sıralama yapamıyorum burada => table.find (query) .sort ({"eventStartsAt": -1}). Atla (ofset) .limit (max) –

İlgili konular