我是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")将返回带有meta的结果集并获取行 $ db - >可以使用执行(" $ qry") - > getRows()。如何在续集中实现这一目标?
答案 0 :(得分:1)
Sequelize不使用结果集或行等概念。它是一个ORM,因此行(包括嵌套关联)被视为具有嵌套对象的对象。它还应用了“活动记录”模式,因此每个返回的对象都添加了额外的方法,如“保存”,“更新”,“删除”等。
当Sequelize实例被序列化为JSON时,它们会删除所有Sequelize“元数据”属性,只返回简单对象,如您所料。
此外,Sequelize实例使用属性getter和setter来透明地表现得像简单的JS对象。这意味着您可以执行agent_list[0].myProperty = 1; console.log(agent_list[0].myProperty);
之类的操作,它会表现得像您期望的那样。这样做的原因是它可以跟踪更新的值,因此以后“更新”调用只会更新已更改的列。
您无需手动从查询结果中获取“行”。
答案 1 :(得分: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);
});