Sails 模型方法支持的语法称为 Waterline 查询语言。Waterline 知道如何解释此语法以从任何支持的数据库中检索或更改记录。在幕后,Waterline 使用您的项目中安装的数据库适配器将这种语言转换为原生查询,并将这些查询发送到相应的数据库。这意味着您可以使用与 Redis 或 MongoDB 相同的查询与 MySQL 进行交互。这也意味着您可以更改您的数据库,而对应用程序代码的更改很少(如果有的话)。
查询对象使用四种类型的对象键之一形成。这些是查询对象中使用的高级键。它们松散地基于 MongoDB 中使用的条件,但有一些细微的差异。
查询可以使用 `where` 键来指定属性,也可以不使用 `where` 键。
使用 `where` 键允许您也使用 查询选项,例如 `limit`、`skip` 和 `sort`。
var thirdPageOfRecentPeopleNamedMary = await Model.find({
where: { name: 'mary' },
skip: 20,
limit: 10,
sort: 'createdAt DESC'
});
约束可以在更复杂的示例中进一步组合在一起。
var teachersNamedMaryInMaine = await Model.find({
where: { name: 'mary', state: 'me', occupation: { contains: 'teacher' } },
sort: [{ firstName: 'ASC'}, { lastName: 'ASC'}]
});
如果省略了 `where`,则整个对象将被视为 `where` 条件。
var peopleNamedMary = await Model.find({
name: 'mary'
});
键值对可用于搜索与指定内容完全匹配值的记录。这是条件对象的基准,其中键表示模型上的属性,而值是记录的严格相等性检查以匹配值。
var peopleNamedLyra = await Model.find({
name: 'lyra'
});
它们可以一起使用以搜索多个属性。
var waltersFromNewMexico = await Model.find({
name: 'walter',
state: 'new mexico'
});
复杂约束也具有用于键的模型属性,但它们还使用任何支持的条件修饰符执行严格相等性检查无法进行的查询。
var peoplePossiblyNamedLyra = await Model.find({
name : {
'contains' : 'yra'
}
});
提供一个数组以查找其属性值与指定搜索词中的任何一个完全匹配的记录。
这或多或少等同于 SQL 中的“IN”查询,以及 MongoDB 中的 `$in` 运算符。
var waltersAndSkylers = await Model.find({
name : ['walter', 'skyler']
});
提供一个包含在 `!=` 键下的字典中的数组(例如 `{'!=': [...]}`),以查找属性值不是指定搜索词中的任何一个的精确匹配的记录。
这或多或少等同于 SQL 中的“NOT IN”查询,以及 MongoDB 中的 `$nin` 运算符。
var everyoneExceptWaltersAndSkylers = await Model.find({
name: { '!=' : ['walter', 'skyler'] }
});
使用 `or` 修饰符匹配您指定为查询对数组的任何嵌套规则集。对于要匹配 `or` 查询的记录,它们必须至少匹配 `or` 数组中指定的查询修饰符之一。
var waltersAndTeachers = await Model.find({
or : [
{ name: 'walter' },
{ occupation: 'teacher' }
]
});
以下修饰符可用于构建查询。
'<'
'<='
'>'
'>='
'!='
不包含
包含
包含
以…开头
以…结尾
请注意,与具有 JSON 属性的属性匹配时,条件修饰符的可用性和行为可能会根据您使用的数据库适配器而有所不同。例如,虽然 `sails-postgresql` 会将您的 JSON 属性映射到 JSON 列类型,但您需要 发送原生查询以直接查询这些属性。另一方面,`sails-mongo` 支持针对 JSON 类型属性的查询,但您应该注意,如果字段包含数组,则查询条件将针对数组中的每个项目运行,而不是针对数组本身(这是基于 MongoDB 本身的行为)。
搜索值为小于指定值的记录。
Model.find({
age: { '<': 30 }
});
搜索值为小于或等于指定值的记录。
Model.find({
age: { '<=': 20 }
});
搜索值为大于指定值的记录。
Model.find({
age: { '>': 18 }
});
搜索值为大于或等于指定值的记录。
Model.find({
age: { '>=': 21 }
});
搜索值为不等于指定值的记录。
Model.find({
name: { '!=': 'foo' }
});
搜索值为指定值列表中的记录。
Model.find({
name: { in: ['foo', 'bar'] }
});
搜索值为不在指定值列表中的记录。
Model.find({
name: { nin: ['foo', 'bar'] }
});
搜索属性值包含给定字符串的记录。
var musicCourses = await Course.find({
subject: { contains: 'music' }
});
出于性能原因,`contains` 的大小写敏感性取决于数据库适配器。
搜索属性值以给定字符串开头的记录。
var coursesAboutAmerica = await Course.find({
subject: { startsWith: 'american' }
});
出于性能原因,`startsWith` 的大小写敏感性取决于数据库适配器。
搜索属性值以给定字符串结尾的记录。
var historyCourses = await Course.find({
subject: { endsWith: 'history' }
});
出于性能原因,`endsWith` 的大小写敏感性取决于数据库适配器。
查询选项允许您细化从查询返回的结果。它们与 `where` 键一起使用。当前可用的选项有
限制
跳过
排序
限制从查询返回的结果数量。
Model.find({ where: { name: 'foo' }, limit: 20 });
注意:如果您将 `limit` 设置为 0,查询将始终返回空数组。
返回所有结果,不包括要跳过的项目数量。
Model.find({ where: { name: 'foo' }, skip: 10 });
skip
和 limit
可以一起使用来构建分页系统。
Model.find({ where: { name: 'foo' }, limit: 10, skip: 10 });
Waterline
您可以在下面找到有关 Waterline API 的更多信息
结果可以按属性名称排序。只需为自然(升序)排序指定属性名称,或指定 `ASC` 或 `DESC` 标志分别用于升序或降序排序。
// Sort by name in ascending order
Model.find({ where: { name: 'foo' }, sort: 'name' });
// Sort by name in descending order
Model.find({ where: { name: 'foo' }, sort: 'name DESC' });
// Sort by name in ascending order
Model.find({ where: { name: 'foo' }, sort: 'name ASC' });
// Sort by object notation
Model.find({ where: { name: 'foo' }, sort: [{ 'name': 'ASC' }] });
// Sort by multiple attributes
Model.find({ where: { name: 'foo' }, sort: [{ name: 'ASC'}, { age: 'DESC' }] });