从没有元信息的查询中获取结果集 Sequelize

Get Resultset From Query without Meta Information Sequelize

我是 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 检索的数据以及元信息,如 options:{...} ,modelOptions: {...} 等。dataValues 对象包含我想要的数据。结果集是嵌套的 js 对象,每个对象都具有相同的结构,因此很难遍历结果集并仅获取数据值。

我有与 PHP 合作的经验 $db -> Execute("$qry") 将 return 结果集与元并获取行 $db -> Execute("$qry")->getRows() 可以使用。如何在续集中实现这一目标?

有一个名为 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);
});

Sequelize 不使用结果集或行等概念。它是一个 ORM,因此行(包括嵌套关联)被视作具有嵌套对象的对象。它还应用了 "Active Record" 模式,因此每个 returned 对象都添加了额外的方法,如 "save"、"update"、"delete" 等等。

当 Sequelize 实例被序列化为 JSON 时,它们会剥离所有 Sequelize "metadata" 属性,而只是 return 简单对象,正如您所期望的那样。

此外,Sequelize 实例利用 属性 getter 和 setter 来透明地表现得像简单的 JS 对象。这意味着您可以执行 agent_list[0].myProperty = 1; console.log(agent_list[0].myProperty); 之类的操作,它会像您期望的那样运行。它这样做的原因是它可以跟踪更新的值,因此以后的 "update" 调用将只更新已更改的列。

您应该不需要从查询结果中手动获取 "rows"。