2016-05-10 128 views
6

我是Node.js/Sequelize.js的新手。我有以下的代碼查詢:從沒有元信息的查詢獲取結果集續集

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

            }); 

聲明 「的console.log(agent_list)」 打印從DB加上類似的選項元信息檢索的數據:{...},modelOptions:{.. 。} dataValues對象包含我想要的數據。結果集是嵌套的js對象,每個對象具有相同的結構,因此循環遍歷結果集並僅獲取dataValues非常困難。

我有經驗與PHP的工作,其中像這樣 $ DB - >執行( 「$ QRY」)將返回結果集與元,並獲得行 $ DB - >執行( 「$ QRY」) - > getRows()可以使用。如何實現這個續集?

回答

0

有一個名爲sequelize-values的npm軟件包,您可以使用它。

所以你的情況,你的代碼將

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

我已經通過修改來實現您的解決方案。 'then(function(agent_list)agent_list.map(function(agent){ console.log(agent.getValues()); });});' 它工作的很好。正是我需要的。 –

+0

那麼,如果你只是想記錄他們,也許你應該考慮使用forEach。 Map函數實際上希望你返回一些東西作爲映射操作的結果 –

0

Sequelize不使用的概念,如結果集或行。它是一個ORM,因此行(包括嵌套關聯)被視爲具有適當嵌套對象的對象。它也應用了「活動記錄」模式,因此每個返回的對象都會添加其他方法,如「保存」,「更新」,「刪除」等。

當Sequelize實例序列化爲JSON時,它們會剝離所有Sequelize「元數據」屬性,並返回簡單對象,就像您期望的那樣。

此外,Sequelize實例使用屬性獲取器和設置器來透明地表現得像簡單的JS對象。這意味着你可以做類似agent_list[0].myProperty = 1; console.log(agent_list[0].myProperty);的事情,它會表現得像你期望的那樣。這樣做的原因是它可以跟蹤更新的值,所以稍後的「更新」調用將只更新已更改的列。

您應該無需從查詢結果中手動獲取「行」。

+0

是的,對於JSON去除所有元信息,但是我需要在轉換爲JSON之前對結果做進一步的處理。 我有95列在表中。爲每個屬性調用get方法將會非常麻煩。 –

+0

我的觀點是,你不需要顯式調用.get()或.toJSON()以處理任何東西。您可以將每個對象(行)的屬性(列)映射到所需輸出對象的屬性。例如。 'var output = {outProp:input.columnA + input.columnB);',其中「input」是Sequelize模型(行)的一個實例。 –

+0

我現在在做的是findAll返回所有數據行+元數據。我在_JSON方法內部使用_.omit()來省略我不需要響應的列。然後如上面的答案建議我使用sequelize-values來映射輸出。這是一個不好的做法?我仍然在學習node.js/sequelize.js –