2016-05-10 42 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 –