Jam*_*mie 9 sql-server sequelize.js
有时我只想从多行中选择一个值。
假设我有一个如下所示的帐户模型:
帐户
而且我只想选择名称。
您将编写如下内容:
AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
});
Run Code Online (Sandbox Code Playgroud)
但这将返回带有对象的数组。
[{Name : "Sample 1"}, {"Name" : "Sample 2"}]
Run Code Online (Sandbox Code Playgroud)
我想得到一个只有这样名称的数组:
["Sample 1", "Sample 2"]
Run Code Online (Sandbox Code Playgroud)
使用Sequelize是否可以实现这一目标?我在文档中搜索过,但是找不到。
2020年解决方案
大家好,您可以轻松地执行纯“拔除”方法:
const someVariable = [
... ( await AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
})),
].map(account => account.Name);
Run Code Online (Sandbox Code Playgroud)
使用Sequelize 3.13.0,似乎不可能find返回一个平面值数组而不是对象数组。
解决问题的一种方法是使用下划线或lodash映射结果:
AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
})
.then(function(accounts) {
return _.map(accounts, function(account) { return account.Name; })
})
Run Code Online (Sandbox Code Playgroud)
快速说明,设置raw: true使Sequelize查找方法返回普通的旧JavaScript对象(即,没有Instance方法或元数据)。这对于性能而言可能很重要,但在转换为JSON之后不会更改返回的值。这是因为Instance :: toJSON始终返回纯JavaScript对象(没有Instance方法或元数据)。
这是使用lambda表达式的cfogelberg答案的一个不错的ES6版本(Array.prototype.map()仅在IE9 +和lambda(箭头)函数中有效,不支持IE):
AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
})
.then(accounts => accounts.map(account => account.Name));
Run Code Online (Sandbox Code Playgroud)
这是我用于概念验证的一段摘要。如果不起作用,则说明您使用的是上述不受支持的浏览器之一(无论如何,您都不应直接从浏览器进行数据库调用):
AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
})
.then(accounts => accounts.map(account => account.Name));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8082 次 |
| 最近记录: |