Sails 模型方法支援的語法稱為 Waterline 查詢語言。Waterline 知道如何解讀此語法,以從任何支援的資料庫中檢索或變更記錄。在底層,Waterline 使用安裝在您專案中的資料庫配接器,將此語言翻譯成本機查詢,並將這些查詢傳送到適當的資料庫。這表示您可以使用與 MySQL 相同的查詢,也能用於 Redis 或 MongoDB。這也表示您可以變更資料庫,而對您的應用程式程式碼進行的變更極少(如果有的話)。
條件物件是使用四種物件鍵的其中一種形成的。這些是在查詢物件中使用的頂層鍵。它們大致上是根據 MongoDB 中使用的條件,但有一些細微的變化。
可以使用 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' }
]
});
以下修飾符可用於建立查詢時。
'<'
'<='
'>'
'>='
'!='
nin
in
contains
startsWith
endsWith
請注意,當針對具有 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
鍵結合使用。目前可用的選項有
limit
skip
sort
限制從查詢返回的結果數量。
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' }] });