web-dev-qa-db-ja.com

MongoDBの存在を確認する方法

MongoDBとC#でオブジェクトの存在を確認する方法を知りたいのですが。

私はそれを行う方法を見つけましたが、Any()メソッドのおかげでLinqを使用する必要がありましたが、Linqなしでそれを行うことが可能かどうか知りたいですか?

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()

みんなありがとう!

18
John

$ 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));
17
Andrew Orsich

最も単純なタイプ/リファクタリングセーフオプションは、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クエリに変換されるため、メモリの問題はありません)。

8
i3arnon

2.xバージョンのドライバーに存在するかどうかを確認する方法は次のとおりです。

bool exists = collection.Find(_ => _.Name == applicationName).Any();

または非同期的に:

bool exists = await collection.Find(_ => _.Name == applicationName).AnyAsync();;
4
i3arnon

MongoCollection.Existsは、特定のドキュメントが存在するかどうかではなく、コレクション自体が存在するかどうかを確認します。

Query.Exists($ existsのQueryBuilderバージョン)は、ドキュメントに特定のフィールドが(名前で)含まれているかどうかを照会するために使用されます。

クエリに一致するドキュメントが存在するかどうかをクエリする「公式の」方法はありませんが、カウントを使用するというAndrewOrsichによる提案がおそらく最良の方法です。とにかく一致するドキュメントを処理する場合は、Findのバリエーションを使用してクエリを実行することをお勧めします。

1
Robert Stam

this から私たちが読んだ記事:

ただし、findOne()は常にドキュメントを読み取り、ドキュメントが存在する場合はそれを返すため、find()+ limit()を使用する方がはるかに高速です。 find()はカーソルを返す(または返さない)だけで、カーソルを反復処理した場合にのみデータを読み取ります。

つまり、次のようなものを使用します。

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Limit(1)

おそらく最速でしょう。

0

公式チュートリアルに描かれている方法を提案します

http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods

あなたは存在を見つけるために見つけて数えることができます。

編集:メモリの問題を修正するために、MongoCollectionオブジェクトのExistsメソッドが「存在する」ようです;)

0
Mauro

CountDocumentメソッドを使用します:

long count = await items.CountDocumentsAsync(yourFilter, null, cancellationToken);

if(count > 0)
{
    //document exists
}
0