MongoDB学習(翻訳2)
35722 ワード
C#駆動のLINQチュートリアル
紹介する
このチュートリアルでは、linqクエリーのサポートを1.8リリースで説明します.
このチュートリアルを開始する前に、少なくともC#ドライバチュートリアルのCドライバの説明を読んでください.
クイックスタート
まず、次のネーミングスペースをプログラムに追加します.
次に、変数を宣言してコレクションへの参照を保存します.
最も基本的なlinqクエリを呼び出す方法は、AsQueryable()を呼び出すことで、linqを正常に呼び出す集合変数を構築することです.
例:
もちろん、lambda構文でクエリー式を書くこともできます.以前のクエリー文は次のように書くことができます.
C#コンパイラは内部ですべてのクエリーをlambda構文に翻訳するので、この2つの書き方には優略的な区別はありません.必要な場合(クエリーオペレータがサポートされていない場合など)、この2つの方法を混用することもできます.
このチュートリアルの例のすべてのコードには、linqクエリー式とlamdba式(クエリーオペレータがサポートされている前提で)が表示されます.
linqクエリが対応するMongoDBクエリに変換できる場合にのみ、クエリの解析がサポートされます.linqクエリを対応するMongoDBクエリに変換できない場合は、プログラムに異常やエラーが発生します.
サポートされているLINQクエリーオペレータ
このセクションでは、サポートされているLINQクエリーオペレータについて説明します. Any
述語を含まないAnyは,集合中にanyドキュメントオブジェクトが存在するかどうかをテストするだけである(anyが直接引用していることはよく知られている).
Any(述語を含む) 述語を含むAnyは、集合内に一致するドキュメントが存在するかどうかをテストするために使用され、一致論理は述語内にある.
投影操作後、述語付きAnyはサポートされない(少なくとも現在のバージョン)ため、次のコードは使用できません.
通常、投影操作の代わりにwhere文を使用すると、投影操作を削除できます. Count
述語なしのCountは、ドキュメントオブジェクトの集合数を返すだけです.
Count(述語付き) 述語のあるCountは、述語が一致するドキュメントの数を返します.
説明:述語はwhere文と述語を持たないCountで置き換えることができるので、上記の例もこのように書くことができます.
述語を含むCountも同様に投影後操作をサポートしないため,以下の書き方は無効である.
解決策はAnyと同じです. Distinct
Distinctは、コレクション内のドキュメントオブジェクトフィールドまたは属性の一意の値を返します.投影後に重複値をフィルタできます.
投影には、特定のフィールドまたはプロパティのファイルを選択する必要があります.このフィールドまたは属性の値がMongoDBに表示されている場合、配列として配列インデックスを使用してデータから1つを選択することもできます.
ElementAt
ElementAtは結果セットから特定のドキュメントを返し、通常はソート操作とともに使用します.
結果セットの文書オブジェクト数がElementAtのインデックス数より少ない場合、例外が報告されます. ElementAtOrDefault
ElementAtOrDefaultはElementAtと同様で、例外を報告するのではなく、コレクション内のオブジェクトがIndexより少ない場合にnullを返します. First
Firstは、通常はソートとともに使用されるコレクション内の最初のオブジェクトを返します.
集合が空の場合、Firstは例外を放出します. First(述語を含む) このリロードでは、where文を使用するfirstクエリに相当する述語ロジックをFirstに提供できます.
First(述語を含む)も投影後の操作をサポートしていないため、次のコードは無効です.
ソリューションもAnyと同じです
コレクションが空の場合、例外も放出されます. FirstOrDefault
FirstOrDefaultとFirstの違いは、集合が空の場合、例外を放出せずnullを返すことです. FirstOrDefault(述語を含む) FirstOrDefault(述語を含む)はFirst(述語を含む)と同様に、集合が空の場合nullを返すと異常が放出されない点が異なります. Last
Lastは結果セットから最後のドキュメントオブジェクトを返します.Firstとは対照的に、通常はソート操作とともに使用されます.
コレクションが空の場合、例外が放出されます. Last(述語を含む) このリロードでは、述語論理をパラメータとしてLastに渡すことができ、述語を持たないLast操作にwhere文を加えることに相当します.
Lastは投影後の操作もサポートしていないので、以下の書き方は無効です.
解決策はAnyと同じです.
コレクションが空の場合、例外が放出されます. LastOrDefault
LastOrDefaultとLastの違いは,前者が集合が空の場合に異常を投げ出さずnullを返すことである. LastOrDefault(述語を含む) LastOrDefault(述語を含む)はLast(述語を含む)と同様に、前者は集合が空の場合nullを返し、異常を投げ出さない点が異なる. LongCount
LongCountの用法はCountと同様に,戻り値は前者が64ビット長整数型,後者が32ビットである点が異なる. LongCount(述語を含む) LongCount(述語を含む)はCount(述語を含む)と同様に,戻り値の前者は64ビット長整数型,後者は32ビットである点が異なる. Max
Maxは、コレクション内のドキュメントオブジェクトのプロパティまたはフィールド値の最大値を返します.投影操作で認識されたフィールドまたはプロパティの最大値をフィルタできます.
投影には、特定のフィールドまたはプロパティのファイルを選択する必要があります.このフィールドまたは属性の値がMongoDBに表示されている場合、配列として配列インデックスを使用してデータから1つを選択することもできます.
Max(セレクタを含む) このMaxリロードでは、投影後のMax操作の代わりに、選択パラメータをMaxに直接渡して最大値をフィルタできます.
Min
Minはコレクション内のドキュメントオブジェクトのプロパティまたはフィールド値の最小値を返します.投影操作で認識されたフィールドまたはプロパティの最小値をフィルタできます.
投影には、特定のフィールドまたはプロパティのファイルを選択する必要があります.このフィールドまたは属性の値がMongoDBに表示されている場合、配列として配列インデックスを使用してデータから1つを選択することもできます.
Min(セレクタを含む) このMinリロードでは、投影後のMax操作の代わりに、選択パラメータをMaxに直接渡して最大値をフィルタできます.
OfType
OfTypeオペレータは、ドキュメントオブジェクトをより正確にクエリーするためにクエリーに識別器を挿入します.
OrderBy
OrderByは、結果セットの昇順ソート順を指定します.
OrderByDescending
OrderByDescending結果セットの降順ソート順を指定します.
Select
Selectは、一致するドキュメントから新しいタイプの結果セットを選択するために使用します.Selectは最後の操作(Distinct,Max,Minなどを除く)でなければなりません.
注意:
Selectは、サーバから返されるドキュメントオブジェクトフィールドまたはプロパティを減らすことはできません.完全なドキュメントオブジェクトは返され、Selectメソッドが呼び出されるので、投影はクライアントにあります.
Single
Singleは結果セットから最初の唯一のファイルを返します.
結果セットが空または複数のドキュメントが存在する場合、Singleは例外を放出します. Single(述語を含む) このリロードは、述語を含まないSingleにwhere文を付けるのと同じように、Singleにパラメータを渡すことができます.
Singleも投影後の操作をサポートしていないため、次のコードは無効です.
解決策はAnyと同じです.
結果セットが空または複数のドキュメントが存在する場合、Singleは例外を放出します. SingleOrDefault
SingleOrDefaultはSingleと同様に、集合が空または複数のドキュメントオブジェクトが存在する場合、例外を放出するのではなくnullを返します. SingleOrDefault(述語を含む) SingleOrDefault(述語を含む)はSingle(述語を含む)と同様に使用されますが、集合が空または複数のドキュメントオブジェクトが存在する場合、例外を放出するのではなくnullが返されます.
Skip
Skipを使用して、結果セットからスキップするファイルの数を指定します.通常、ソート操作と組み合わせて使用されます.
Take
Takeを使用して、サーバから返すファイルの数を指定します.Skipと組み合わせて使用する場合、ソート順を指定することがよくあります.
ThenBy
ThenByは、追加の昇順ソートを指定するための結果セットです.
ThenByDescending
ThenByDescendingは、追加の降順ソートを指定するための結果セットです.
Where
WHERE句は、条件を満たすクエリの結果を返すことを指定します.WHERE句は、表現クエリドキュメントタイプをブール値構文にマッピングします.式がtrueを返すと、結果は結果セットに一致します.
複数のwhere文を使用することもできます.左右は&&オペレータに相当します.
たとえば、次のクエリは等価です.
まずここまで、次の節は
サポートされているwhere文
紹介する
このチュートリアルでは、linqクエリーのサポートを1.8リリースで説明します.
このチュートリアルを開始する前に、少なくともC#ドライバチュートリアルのCドライバの説明を読んでください.
クイックスタート
まず、次のネーミングスペースをプログラムに追加します.
using MongoDB.Driver.Linq;
次に、変数を宣言してコレクションへの参照を保存します.
var collection = database.GetCollection<TDocument>("collectionname");
最も基本的なlinqクエリを呼び出す方法は、AsQueryable
例:
var query =
from e in collection.AsQueryable<Employee>()
where e.FirstName == "John"
select e;
foreach (var employee in query)
{
// do something
}
もちろん、lambda構文でクエリー式を書くこともできます.以前のクエリー文は次のように書くことができます.
var query =
collection.AsQueryable<Employee>()
.Where(e => e.FirstName == "John");
C#コンパイラは内部ですべてのクエリーをlambda構文に翻訳するので、この2つの書き方には優略的な区別はありません.必要な場合(クエリーオペレータがサポートされていない場合など)、この2つの方法を混用することもできます.
このチュートリアルの例のすべてのコードには、linqクエリー式とlamdba式(クエリーオペレータがサポートされている前提で)が表示されます.
linqクエリが対応するMongoDBクエリに変換できる場合にのみ、クエリの解析がサポートされます.linqクエリを対応するMongoDBクエリに変換できない場合は、プログラムに異常やエラーが発生します.
サポートされているLINQクエリーオペレータ
このセクションでは、サポートされているLINQクエリーオペレータについて説明します.
述語を含まないAnyは,集合中にanyドキュメントオブジェクトが存在するかどうかをテストするだけである(anyが直接引用していることはよく知られている).
var result =
(from c in collection.AsQueryable<C>()
select c)
.Any();
//
var result =
collection.AsQueryable<C>()
.Any();
var result =
(from c in collection.AsQueryable<C>()
select c)
.Any(c => c.X == 1);
// or
var result =
collection.AsQueryable<C>()
.Any(c => c.X == 1);
投影操作後、述語付きAnyはサポートされない(少なくとも現在のバージョン)ため、次のコードは使用できません.
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Any(x => x == 1);
通常、投影操作の代わりにwhere文を使用すると、投影操作を削除できます.
述語なしのCountは、ドキュメントオブジェクトの集合数を返すだけです.
var result =
(from c in collection.AsQueryable<C>()
select c)
.Count();
//
var result =
collection.AsQueryable<C>()
.Count();
var result =
(from c in collection.AsQueryable<C>()
select c)
.Count(c => c.X == 1);
// or
var result =
collection.AsQueryable<C>()
.Count(c => c.X == 1);
説明:述語はwhere文と述語を持たないCountで置き換えることができるので、上記の例もこのように書くことができます.
var result =
(from c in collection.AsQueryable<C>()
where c.X == 1
select c)
.Count();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X == 1)
.Count();
述語を含むCountも同様に投影後操作をサポートしないため,以下の書き方は無効である.
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Count(x => x == 1);
解決策はAnyと同じです.
Distinctは、コレクション内のドキュメントオブジェクトフィールドまたは属性の一意の値を返します.投影後に重複値をフィルタできます.
var result =
(from c in collection.AsQueryable<C>()
select c.X)
.Distinct();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Distinct();
投影には、特定のフィールドまたはプロパティのファイルを選択する必要があります.このフィールドまたは属性の値がMongoDBに表示されている場合、配列として配列インデックスを使用してデータから1つを選択することもできます.
var result =
(from c in collection.AsQueryable<C>()
select c.A[i])
.Distinct();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.A[i])
.Distinct();
ElementAtは結果セットから特定のドキュメントを返し、通常はソート操作とともに使用します.
var result =
(from c in collection.AsQueryable<C>()
where c.X > 0
orderby c.X
select c)
.ElementAt(index);
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > 0)
.OrderBy(c => c.X)
.ElementAt(index);
結果セットの文書オブジェクト数がElementAtのインデックス数より少ない場合、例外が報告されます.
ElementAtOrDefaultはElementAtと同様で、例外を報告するのではなく、コレクション内のオブジェクトがIndexより少ない場合にnullを返します.
Firstは、通常はソートとともに使用されるコレクション内の最初のオブジェクトを返します.
var result =
(from c in collection.AsQueryable<C>()
where c.X > 0
orderby c.X
select c)
.First();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > 0)
.OrderBy(c => c.X)
.First();
集合が空の場合、Firstは例外を放出します.
var result =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.First(c => c.X > 0);
// or
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.First(c => c.X > 0);
First(述語を含む)も投影後の操作をサポートしていないため、次のコードは無効です.
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Select(c => c.X)
.First(x => x > 0);
ソリューションもAnyと同じです
コレクションが空の場合、例外も放出されます.
FirstOrDefaultとFirstの違いは、集合が空の場合、例外を放出せずnullを返すことです.
Lastは結果セットから最後のドキュメントオブジェクトを返します.Firstとは対照的に、通常はソート操作とともに使用されます.
var result =
(from c in collection.AsQueryable<C>()
where c.X > 0
orderby c.X
select c)
.Last();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > 0)
.OrderBy(c => c.X)
.Last();
コレクションが空の場合、例外が放出されます.
var result =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Last(c => c.X > 0);
// or
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Last(c => c.X > 0);
Lastは投影後の操作もサポートしていないので、以下の書き方は無効です.
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Select(c => c.X)
.Last(x => x > 0);
解決策はAnyと同じです.
コレクションが空の場合、例外が放出されます.
LastOrDefaultとLastの違いは,前者が集合が空の場合に異常を投げ出さずnullを返すことである.
LongCountの用法はCountと同様に,戻り値は前者が64ビット長整数型,後者が32ビットである点が異なる.
Maxは、コレクション内のドキュメントオブジェクトのプロパティまたはフィールド値の最大値を返します.投影操作で認識されたフィールドまたはプロパティの最大値をフィルタできます.
var result =
(from c in collection.AsQueryable<C>()
select c.X)
.Max();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Max();
投影には、特定のフィールドまたはプロパティのファイルを選択する必要があります.このフィールドまたは属性の値がMongoDBに表示されている場合、配列として配列インデックスを使用してデータから1つを選択することもできます.
var result =
(from c in collection.AsQueryable<C>()
select c.A[i])
.Max();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.A[i])
.Max();
var result =
(from c in collection.AsQueryable<C>()
select c)
.Max(c => c.X);
// or
var result =
collection.AsQueryable<C>()
.Max(c => c.X);
Minはコレクション内のドキュメントオブジェクトのプロパティまたはフィールド値の最小値を返します.投影操作で認識されたフィールドまたはプロパティの最小値をフィルタできます.
var result =
(from c in collection.AsQueryable<C>()
select c.X)
.Min();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.X)
.Min();
投影には、特定のフィールドまたはプロパティのファイルを選択する必要があります.このフィールドまたは属性の値がMongoDBに表示されている場合、配列として配列インデックスを使用してデータから1つを選択することもできます.
var result =
(from c in collection.AsQueryable<C>()
select c.A[i])
.Min();
// or
var result =
collection.AsQueryable<C>()
.Select(c => c.A[i])
.Min();
var result =
(from c in collection.AsQueryable<C>()
select c)
.Min(c => c.X);
// or
var result =
collection.AsQueryable<C>()
.Min(c => c.X);
OfTypeオペレータは、ドキュメントオブジェクトをより正確にクエリーするためにクエリーに識別器を挿入します.
var result =
(from c in collection.AsQueryable<C>().OfType<D>()
select c)
// or
var result =
collection.AsQueryable<C>()
.OfType<D>();
OrderByは、結果セットの昇順ソート順を指定します.
var query =
from c in collection.AsQueryable<C>()
orderby c.X
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X);
OrderByDescending結果セットの降順ソート順を指定します.
var query =
from c in collection.AsQueryable<C>()
orderby c.X descending
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderByDescending(c => c.X);
Selectは、一致するドキュメントから新しいタイプの結果セットを選択するために使用します.Selectは最後の操作(Distinct,Max,Minなどを除く)でなければなりません.
注意:
Selectは、サーバから返されるドキュメントオブジェクトフィールドまたはプロパティを減らすことはできません.完全なドキュメントオブジェクトは返され、Selectメソッドが呼び出されるので、投影はクライアントにあります.
var query =
from c in collection.AsQueryable<C>()
select new { c.X, c.Y };
// or
var query =
collection.AsQueryable<C>()
.Select(c => new { c.X, c.Y });
Singleは結果セットから最初の唯一のファイルを返します.
var result =
(from c in collection.AsQueryable<C>()
where c.X > 0
orderby c.X
select c)
.Single();
// or
var result =
collection.AsQueryable<C>()
.Where(c => c.X > 0)
.OrderBy(c => c.X)
.Single();
結果セットが空または複数のドキュメントが存在する場合、Singleは例外を放出します.
var result =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Single(c => c.X > 0);
// or
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Single(c => c.X > 0);
Singleも投影後の操作をサポートしていないため、次のコードは無効です.
var result =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Select(c => c.X)
.Single(x => x > 0);
解決策はAnyと同じです.
結果セットが空または複数のドキュメントが存在する場合、Singleは例外を放出します.
SingleOrDefaultはSingleと同様に、集合が空または複数のドキュメントオブジェクトが存在する場合、例外を放出するのではなくnullを返します.
Skipを使用して、結果セットからスキップするファイルの数を指定します.通常、ソート操作と組み合わせて使用されます.
var query =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Skip(100);
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Skip(100);
Takeを使用して、サーバから返すファイルの数を指定します.Skipと組み合わせて使用する場合、ソート順を指定することがよくあります.
var query =
(from c in collection.AsQueryable<C>()
orderby c.X
select c)
.Skip(100)
.Take(100);
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.Skip(100)
.Take(100);
ThenByは、追加の昇順ソートを指定するための結果セットです.
var query =
from c in collection.AsQueryable<C>()
orderby c.X, c.Y
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.ThenBy(c => c.Y);
ThenByDescendingは、追加の降順ソートを指定するための結果セットです.
var query =
from c in collection.AsQueryable<C>()
orderby c.X, c.Y descending
select c;
// or
var query =
collection.AsQueryable<C>()
.OrderBy(c => c.X)
.ThenByDescending(c => c.Y);
WHERE句は、条件を満たすクエリの結果を返すことを指定します.WHERE句は、表現クエリドキュメントタイプをブール値構文にマッピングします.式がtrueを返すと、結果は結果セットに一致します.
var query =
from c in collection.AsQueryable<C>()
where c.X > 0
select c;
// or
var query =
collection.AsQueryable<C>()
.Where(c => c.X > 0);
複数のwhere文を使用することもできます.左右は&&オペレータに相当します.
たとえば、次のクエリは等価です.
var query =
(from c in collection.AsQueryable<C>()
where c.X > 0
where c.Y > 0)
.First(c.Z > 0);
// or
var query =
(from c in collection.AsQueryable<C>()
where c.X > 0 && c.Y > 0 && c.Z > 0)
.First();
まずここまで、次の節は
サポートされているwhere文