2016-05-10 14 views
6

Sono nuovo su Node.js/Sequelize.js. Ho seguente pezzo di codice per query:Ottieni set di risultati da query senza informazioni metriche Sequenza

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); 

            }); 

L'affermazione "console.log (agent_list)" la stampa dei dati recuperati dal db più il meta-informazioni come le opzioni: {...}, modelOptions: {.. .} ecc. L'oggetto dataValues ​​contiene i dati che voglio. Il set di risultati è oggetti js annidati, ognuno ha la stessa struttura, quindi sarebbe molto difficile eseguire il ciclo di loop del set di risultati e ottenere solo i valori dei dati.

Ho esperienza di lavoro con PHP in cui qualcosa di simile $ db -> Esegui ("$ qry") sarebbero tornati di risultati con meta e per ottenere le righe $ db -> Esegui ("$ qry") -> getRows() può essere utilizzato. Come ottenere questo in sequenza?

risposta

0

C'è un pacchetto npm chiamato sequelize-values che è possibile utilizzare.

Quindi nel tuo caso, il codice sarebbe

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

Ho implementato la soluzione con un po 'di modifica. '(funzione (agent_list) { agent_list.map (funzione (agente) { console.log (agent.getValues ​​()); });});' Funziona alla grande. Esattamente quello di cui avevo bisogno. –

+0

Bene, se vuoi solo registrarli forse dovresti prendere in considerazione l'uso di forEach. La funzione mappa in realtà si aspetta che tu restituisca qualcosa come risultato dell'operazione della mappa –

0

Sequelize non usa concetti come gruppi di risultati o le righe. È un ORM, quindi le righe (comprese le associazioni nidificate) vengono trattate come oggetti con oggetti nidificati come appropriato. Inoltre applica un pattern "Active Record", quindi ogni oggetto restituito ha aggiunto un ulteriore metodo, come "save", "update", "delete" e altro.

Quando Sequenza le istanze sono serializzate su JSON, esse rimuovono tutte le proprietà "metadati" di Sequelize e restituiscono semplicemente oggetti semplici, come ci si aspetterebbe.

Inoltre, Sequenza di istanze fa uso di getter di proprietà e setter per comportarsi in modo trasparente come semplici oggetti JS. Ciò significa che puoi fare qualcosa come agent_list[0].myProperty = 1; console.log(agent_list[0].myProperty); e si comporterà come ti aspetti. Il motivo per cui lo fa è che può tenere traccia dei valori aggiornati, quindi in seguito le chiamate di "aggiornamento" aggiorneranno solo le colonne che sono state modificate.

Non dovrebbe essere necessario ottenere manualmente le "righe" dal risultato della query.

+0

Sì toJSON rimuove tutte le metainformazioni, ma ho bisogno di eseguire ulteriori elaborazioni sul risultato prima di convertirmi in JSON. Ho 95 colonne nella tabella. Chiamare il metodo get per ogni attributo sarebbe troppo macchinoso. –

+0

Il mio punto è che non è necessario chiamare esplicitamente .get() o .toJSON() per elaborare qualcosa. È possibile mappare solo le proprietà (colonne) di ciascun oggetto (riga) alle proprietà dell'oggetto di output desiderato. Per esempio. 'var output = {outProp: input.columnA + input.columnB);', dove "input" è un'istanza di un modello Sequelize (riga). –

+0

Quello che sto facendo attualmente è findAll restituisce tutte le righe di dati + meta dati. Sto usando _.omit() all'interno del metodo toJSON per omettere le colonne che non ho bisogno in risposta. Quindi come sopra la risposta suggerisco di usare i valori sequelize per mappare l'output. è una cattiva pratica? Sto ancora imparando node.js/sequelize.js –

Problemi correlati