2016-05-10 16 views
6

Node.js/Sequelize.js'de yeniyim. Ben sorgu için kod parçasını şu var: {...}, modelOptions:Meta Bilgileri olmadan Sorgudan Kaynak Alma Sequelize

var agent_list = models.agent.findAll({ 
             subQuery: false, 
             where: qry_filter, 
             attributes: select_attributes, 
             include:include_models, 
             group: ['agent_id'], 
             order: agent_data.sort || appConfig.DEFAULT_AGENT_SORT, 
             limit: agent_data.num_results || appConfig.DEFAULT_RESPONSE_SIZE 

            }) 

            .then(function(agent_list){ 

             console.log(agent_list); 

            }); 

açıklamada "console.log (agent_list)" db artı seçenekleri gibi meta bilgi alınan verileri yazdırır {.. .} vb dataValues ​​nesnesi, istediğim verileri içerir. Resultset iç içe js nesneleridir, her biri aynı yapıya sahiptir, bu yüzden sonuç kümesinde döngü yapmak ve yalnızca dataValues ​​almak çok zor olacaktır.

PHP ile çalışma deneyimine sahip nerede böyle bir şey $ db -> ("$ Qry") meta ile resultset dönmek ve almak Yürütme satırlar $ db -> Çalıştır ("$ qry") -> getRows() kullanılabilir. Bunu nasıl sonuçlandırmak için?

cevap

0

Kullanabileceğiniz sequelize-values adında bir npm paketi var.

Yani sizin durumda, kodunuz

models.agent.findAll({ 
    subQuery: false, 
    where: qry_filter, 
    attributes: select_attributes, 
    include: include_models, 
    group: ['agent_id'], 
    order: agent_data.sort || appConfig.DEFAULT_AGENT_SORT, 
    limit: agent_data.num_results || appConfig.DEFAULT_RESPONSE_SIZE 
}).then(function(agent_list) { 
    return agent_list.map(function(agent) { 
     return agent.getValues(); 
    }); 
}).then(function(agent_list) { 
    console.log(agent_list); 
}); 
+0

Çözümünüzü biraz değiştirerek uyguladım. 'sonra (fonksiyonu (agent_list) { agent_list.map (fonksiyonu (ajan) { console.log (agent.getValues ​​()); });}); Büyük çalışmaktadır' . Tam olarak ihtiyacım olan şey. –

+0

Eh, sadece onları oturum açmak istiyorsanız belki yerine forEach kullanmayı düşünmelisiniz. Harita işlevi aslında harita işleminin sonucu olarak bir şey döndürmenizi bekler –

0

Sequelize resultsets veya satırlara gibi kavramları kullanmaz olacaktır. Bu bir ORM'dir, bu nedenle satırlar (iç içe geçmiş ilişkilendirmeler dahil) uygun şekilde iç içe geçmiş nesnelere sahip nesneler olarak kabul edilir. Ayrıca bir "Aktif Kayıt" kalıbı da uygular, böylece her bir döndürülen nesneye "kaydet", "güncelle", "sil" ve daha fazlası gibi ek bir yöntemi eklenir.

Sequelize örnekleri JSON'a serileştirildiğinde, tüm Sequelize "meta verileri" özelliklerini çıkarır ve basit nesneleri beklediğiniz gibi döndürürler.

Ayrıca, Sequelize örnekleri basit JS nesneleri gibi şeffaf davranmaları için özellik alıcılarını ve ayarlayıcılarını kullanır. Bu, agent_list[0].myProperty = 1; console.log(agent_list[0].myProperty); gibi bir şey yapabileceğiniz anlamına gelir ve beklediğiniz gibi davranacaktır. Bunu yapabilmesinin nedeni, güncellenmiş değerleri takip edebilmesidir, bu nedenle daha sonra "güncelleme" aramaları yalnızca değiştirilen sütunları güncelleyecektir.

Sorgu sonucundan "satırları" el ile almanıza gerek yoktur.

+0

Evet toJSON tüm meta bilgileri keser, ancak JSON'a dönüştürmeden önce sonuç üzerinde daha fazla işlem yapmam gerekir. Tabloda 95 sütun var. Her özellik için çağrı alma yöntemi çok hantal olacaktır. –

+0

Benim amacım, herhangi bir şeyi işlemek için .get() veya .toJSON() öğesini açıkça çağırmanıza gerek olmamasıdır. Her nesnenin (satır) özelliklerini (sütunları) istediğiniz çıktı nesnesinin özelliklerine göre eşleyebilirsiniz. Örneğin. "var output = {outProp: input.columnA + input.columnB);", "giriş" bir Sequelize modelinin (satır) bir örneğidir. –

+0

Şu anda yapmakta olduğum şey, findAll tüm veri satırlarını + meta verilerini döndürmektir. Yanıt olarak istemediğim sütunları çıkarmak için _.omit() içindeJSON yöntemini kullanıyorum. Daha sonra, yukarıdaki gibi, çıktıyı haritalamak için sıralı değerler kullanıyorum. bu kötü bir uygulama mı? Hala node.js/sequelize.js'yi öğreniyorum –