MongoDBとC#でオブジェクトの存在を確認する方法を知りたいのですが。
私はそれを行う方法を見つけましたが、Any()メソッドのおかげでLinqを使用する必要がありましたが、Linqなしでそれを行うことが可能かどうか知りたいですか?
database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()
みんなありがとう!
$ count 演算子を使用して、メモリの問題を回避します。データベースからメモリにドキュメントをロードしません。
int count = items.FindAs<LedgerDocument>(Query.EQ("name", appName)).Count();
if(count > 0)
{
//then doc exists
}
Mongodbの演算子 $ exists を使用して、ドキュメントにフィールドが存在することを識別できますが、クエリを渡すことはできません。
database.GetCollection<ApplicationViewModel>("Applications")
.Find(Query.Exists("Name", true));
最も単純なタイプ/リファクタリングセーフオプションは、LINQ
*をAsQueryable
とともに使用することです。
var collection = database.GetCollection<ApplicationViewModel>("Applications");
var exists = collection.AsQueryable().Any(avm => avm.Name == applicationName);
これにより、カウントコマンドが作成され、ゼロより大きいことが確認されます。
場合によっては(パフォーマンスが問題になる場合)、all一致するドキュメントをカウントする代わりに、MongoDB
に最初のドキュメントを取得して、存在するかどうかを確認するように指示できます。
var collection = database.GetCollection<ApplicationViewModel>("Applications");
var exists = collection.AsQueryable().FirstOrDefault(avm => avm.Name == applicationName) != null;
ロバート・スタムが指摘したように、両方ともMongoCollection.Exists
およびQuery.Exists
は、この場合は関係ありません。
*バージョン1.4(2012-03-27)以降、ドライバーはLINQ
クエリをサポートします(mongoクエリに変換されるため、メモリの問題はありません)。
2.xバージョンのドライバーに存在するかどうかを確認する方法は次のとおりです。
bool exists = collection.Find(_ => _.Name == applicationName).Any();
または非同期的に:
bool exists = await collection.Find(_ => _.Name == applicationName).AnyAsync();;
MongoCollection.Existsは、特定のドキュメントが存在するかどうかではなく、コレクション自体が存在するかどうかを確認します。
Query.Exists($ existsのQueryBuilderバージョン)は、ドキュメントに特定のフィールドが(名前で)含まれているかどうかを照会するために使用されます。
クエリに一致するドキュメントが存在するかどうかをクエリする「公式の」方法はありませんが、カウントを使用するというAndrewOrsichによる提案がおそらく最良の方法です。とにかく一致するドキュメントを処理する場合は、Findのバリエーションを使用してクエリを実行することをお勧めします。
this から私たちが読んだ記事:
ただし、findOne()は常にドキュメントを読み取り、ドキュメントが存在する場合はそれを返すため、find()+ limit()を使用する方がはるかに高速です。 find()はカーソルを返す(または返さない)だけで、カーソルを反復処理した場合にのみデータを読み取ります。
つまり、次のようなものを使用します。
database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Limit(1)
おそらく最速でしょう。
公式チュートリアルに描かれている方法を提案します
http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods
あなたは存在を見つけるために見つけて数えることができます。
編集:メモリの問題を修正するために、MongoCollectionオブジェクトのExistsメソッドが「存在する」ようです;)
CountDocument
メソッドを使用します:
long count = await items.CountDocumentsAsync(yourFilter, null, cancellationToken);
if(count > 0)
{
//document exists
}