Sailsのモデルメソッドでサポートされている構文は、Waterlineクエリ言語と呼ばれます。Waterlineはこの構文を解釈して、サポートされている任意のデータベースからレコードを取得または変更します。内部的には、Waterlineはプロジェクトにインストールされているデータベースアダプタを使用して、この言語をネイティブクエリに変換し、それらのクエリを適切なデータベースに送信します。これは、MySQLと同じクエリをRedisやMongoDBでも使用できることを意味します。また、アプリケーションコードへの変更を最小限(またはゼロ)に抑えて、データベースを変更できることも意味します。
クエリオブジェクトを作成する際に使用するオブジェクトキーには4つのタイプがあります。これらは、クエリオブジェクトで使用される最上位のキーです。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
配列内の指定されたクエリ修飾子の少なくとも1つに一致する必要があります。
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' }] });