2011-11-08 31 views
3

アイテムのコレクション{url: 'http:// blah'}が指定されています。 URLが「http://stackoverflow.com」のレコードが存在するかどうかを確認するにはどうすればよいですか?レコードがMongoコレクション(C#)に存在するかどうかを確認する方法

p.s.効率的にするために、以前の提案のいずれについても

int count = collection.FindAs<Item>(Query.EQ("url", "http://stackoverflow.com")).Count(); 
if(count > 0) 
{ 
    //do some stuff 
} 

答えて

7

あなたがそこにあることを確認する必要があります。私は、あなたは、単にクエリによって返される項目の数を確認する必要があるC#のドライバ

+1

"var fields = Fields.Include(" url ")。Exclude(" _ id ")を使用すると、URLのインデックスはCovering Indexになり、ドキュメント自体から何もロードせずに結果を提供することができます。 – Appetere

2

と通信していますurl要素のインデックス。それ以外の場合は、完全なコレクションスキャンが必要になります。

答えが0または1であると予想される場合は、おそらくカウントが最も効率的な方法です。カウントが非常に大きくなり、1つ以上あるかどうか本当に気になると思うなら、FindOneが最も効率的なアプローチです。

FindOneは、ドキュメントが実際にはそれほど大きくない限り、ドキュメント全体を返すことは関係ありません。その場合、あなたは(_idが最も可能性の高い候補を思わ)のみのフィールドを返すようにサーバーを言うことができる:MongoDBの中のキーの

var query = Query.EQ("url", "http://stackoverflow.com"); 
var fields = Fields.Include("_id"); 
var res = collection.Find(query).SetFields(fields).SetLimit(1).FirstOrDefault(); 
if (res == null) { 
    // no match found 
} 
+1

wouldntは、これはコレクション全体が検索の代わりに、最初のものを見つけた後返却することができるということだろうとして、長期的にineffecientになるかも? –

1
IMongoQuery query = Query.EQ("url", "http://stackoverflow.com"); 
var res = collection.FindOne(query); 
if(res == null)//don't exist 
{ 

} 
+0

これは、ブール値ではなくオブジェクト全体を返すので、これはやや非効率的ですか? –

0

存在を使用して確認することができますが存在し、2番目のパラメータとして真または偽

var filter = builder.Exists("style", false); 
var RetrievedData = collection.Find(filter).ToList() 

Refference Link

関連する問題