2016-03-28 9 views
6

.sequelize findAll sıralama düzeni Takip olarak sequelize ile veritabanından çıkışa tüm nesne listesini çalışıyor ve nerede fıkrada kimliği eklendi olarak veri dışarı sıralanır almak istiyorum ediyorum

exports.getStaticCompanies = function() { 
    return Company.findAll({ 
     where: { 
      id: [46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680] 
     }, 
     attributes: ['id', 'logo_version', 'logo_content_type', 'name', 'updated_at'] 
    }); 
}; 

Ancak sorun, görüntülendikten sonra, tüm veriler aşağıdaki gibi sıralanır. Bulduğum gibi

46128, 53326, 2865, 1488, 45600, 61680, 49569, 1418, .... 

, bu kimliği ne de adına göre sıralanmış oluyor ne. Lütfen bana nasıl çözüleceğime yardım edin.

cevap

11

sequelize olarak kolayca maddelerine göre sırasını ekleyebilir.

exports.getStaticCompanies = function() { 
    return Company.findAll({ 
     where: { 
      id: [46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680] 
     }, 
     // Add order conditions here.... 
     order: [ 
      ['id', 'DESC'], 
      ['name', 'ASC'], 
     ], 
     attributes: ['id', 'logo_version', 'logo_content_type', 'name', 'updated_at'] 
    }); 
}; 

order Nesne dizisini nasıl eklediğimi görün?

order: [ 
     ['COLUMN_NAME_EXAMPLE', 'ASC'], // Sorts by COLUMN_NAME_EXAMPLE in ascending order 
], 

Düzenleme:

Onların .then() vaadi içine alınan kıldıktan sonra nesneleri sipariş etmek gerekebilir. bildiğim kadarıyla söyleyebilirim, o maddeleri ikili olması gerekiyordu çünkü,

How do I sort an array of objects based on the ordering of another array?

+0

ben '46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680' tarafından böyle sipariş etmek istiyorum. – ppshein

+0

Hmmm. Bunu yapamayacaksın (bildiğim kadarıyla)! Sen .o() vaadi onları aldık bir kere nesneleri sınıflandırmak içine bakmak gerekecek? Neden bu özel aralığında tekrar sipariş gerekiyor ?! Bunu senin için yapabilecek bir sipariş maddesi var mı? @ppshein – James111

0

Bu Sequelize's order clause mümkün olduğunu düşünmüyorum: Bir özel sırasına göre nesneleri dizisini siparişi hakkında bu soruyu Ödemeye listenizdeki her öğeye uygulanabilir işlemler. (Bir liste çalıştığını sıralama nasıl genellikle olduğu gibi bu da mantıklı.)

Yani, bir sipariş fıkra onu soran üzerinde recursing tarafından sipariş gibi bir şey bir liste yapabiliriz "Bu 2 unsurların eski olan?" doğrudan sipariş ikili operasyon (compare_bigger(1,2) => 2) indirgenemez değil ama sadece keyfi bir dizi (2,4,11,2,9,0) Oysa. [2, 23, 20, 53, 9] döndürür

var numbers = [2, 20, 23, 9, 53]; 
var orderIWant = [2, 23, 20, 53, 9]; 
orderIWant.map(x => { return numbers.find(y => { return y === x })}); 

: Burada, findAll bu konuyu vurmak benim çözeltisi (numbers için döndürülen sonuçlarında alt) idi

. Yapabileceğimiz daha iyi bir anlaşma olduğunu düşünmüyorum. Sen findOne ile sipariş kimlikleri üzerinde yerinde yineleme, ancak 1 yapacak zaman o zaman yapıyoruz n sorgular.

1

Aşağıdaki kod ile bir çok geri elli şekilde gerçekleştirebilirsiniz:

exports.getStaticCompanies = function() { 
    var ids = [46128, 2865, 49569, 1488, 45600, 61991, 1418, 61919, 53326, 61680] 
    return Company.findAll({ 
     where: { 
      id: ids 
     }, 
     attributes: ['id', 'logo_version', 'logo_content_type', 'name', 'updated_at'], 
     order: sequelize.literal('(' + ids.map(function(id) { 
      return '"Company"."id" = \'' + id + '\''); 
     }).join(', ') + ') DESC') 
    }); 
}; 

birkaç düzine kayıtları geçmiş çok kötü performans özellikleri var, çünkü bu biraz sınırlı, ama ölçekte kabul edilir kullanıyorsun.

Bu şuna benzer bir SQL sorgusu üretecek: Eğer MySQL kullanıyorsanız

[...] ORDER BY ("Company"."id"='46128', "Company"."id"='2865', "Company"."id"='49569', [...]) 
0

, sen order by FIELD(id, ...)approach kullanabilirsiniz: Unutmayın

Company.findAll({ 
    where: {id : {$in : companyIds}}, 
    order: sequelize.literal("FIELD(company.id,"+companyIds.join(',')+")") 
}) 

, olabilir yavaş ol. Ancak, JS ile manuel sıralamadan daha hızlı olmalı.