2011-11-08 43 views

回答

7

對於任何上述建議是有效的,你應該確保有一個index元素。否則,將需要完整的收集掃描。

如果您只希望答案是0或1,count可能是最有效的方法。如果您認爲計數會非常大,並且您真正關心的是是否有一個或多個,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

如果你使用「var fields = Fields.Include(」url「)。Exclude(」_ id「),那麼URL上的索引將是一個覆蓋索引,並且能夠提供結果而不從文檔本身加載任何東西。 – Appetere

2

你只需要檢查由該查詢返回的項數通信:

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

難道不證明這從長遠來看將ineffecient作爲整個集合會被搜索,而不是能夠找到的第一個後返回? –

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

} 
+0

這是不是有點低效,因爲它返回整個對象而不僅僅是一個布爾值? –

0

存在,可以通過檢查已存在和第二個參數爲真或假

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

Refference Link

相關問題