2011-06-20 193 views
10

我想知道如何檢查與mongoDB和C#的對象的存在。MongoDB如何檢查存在

我已經找到了一種方法來做到這一點,但我不得不使用Linq感謝Any()方法,但我想知道是否有可能沒有Linq做到這一點?

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

謝謝你們!

+0

爲什麼不LINQ? – Mauro

+0

沒有Linq,因爲我不想處理內存中的元素列表。 – Gui

回答

14

使用$count操作,以避免內存問題,這不加載從數據庫文件到內存:

int count = items.FindAs<LedgerDocument>(Query.EQ("name", appName)).Count(); 

if(count > 0) 
{ 
    //then doc exists 
} 

MongoDB中操作$exists可用於identfy,一些領域的文件存在,但你不能傳遞查詢到它:

database.GetCollection<ApplicationViewModel>("Applications") 
        .Find(Query.Exists("Name", true)); 
+0

嗨安德魯,我們如何過濾你寫的東西?我的意思是,我如何指定我想知道是否存在任何LedgerDocument.Name == SomethingName? – Gui

+0

@JohnSmith:對不起,這是我的錯誤,看到我用正確的代碼更新了我的答案。 –

+0

非常感謝你的回答,你讓我的一天。你的代碼工作得很好。我給你1票+接受的答案。 – Gui

0

我會建議在官方教程

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

你可以找到再算上獲得生存所描繪的方法。

編輯: 對於固定內存問題,現在看來,這「存在」,在MongoCollection對象Exists方法;)

+0

如果內存問題,我認爲這個答案是不值得的,對不對? – Mauro

+0

爲內存編輯 – Mauro

+0

在我的情況下,內存實際上不是問題。我只是想知道10gen的C#驅動程序是否提供了一種「官方」方法來檢查文檔的存在。因爲我用mongo語法看到了這個關鍵字,你可以在這裏看到http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists但是我不知道是否在C#中有類似的東西...... – Gui

1

MongoCollection.Exists檢查集合本身是否存在,而不是是否存在特定文檔。

Query.Exists($存在的查詢生成器版本)用於查詢文檔是否包含特定字段(按名稱)。

沒有「官方」方式來查詢與查詢匹配的文檔是否存在,但Andrew Orsich使用count的建議可能是最好的方法。他們只評論我會補充說的是,如果您要處理匹配的文檔,那麼您可以繼續使用Find的一些變體進行查詢。

3

最簡單的,類型/重構安全的選擇是使用LINQ *與AsQueryable

var collection = database.GetCollection<ApplicationViewModel>("Applications"); 
var exists = collection.AsQueryable().Any(avm => avm.Name == applicationName); 

這將創建一個計數命令並驗證它是大於零。

在某些情況下(在性能是一個問題),而不是計數所有匹配的文檔,你可以簡單地告訴MongoDB獲得第一,並檢查是否有一個:

var collection = database.GetCollection<ApplicationViewModel>("Applications"); 
var exists = collection.AsQueryable().FirstOrDefault(avm => avm.Name == applicationName) != null; 

正如羅伯特·斯塔姆指出在這種情況下,MongoCollection.ExistsQuery.Exists都是不相關的。


*從版本1.4(2012-03-27)驅動程序支持LINQ查詢(轉換爲蒙戈查詢,因此不存在內存問題)。

+1

這當然是正確的。有些人只是使用降價作爲懲罰。 – i3arnon

+0

Mongo驅動程序不支持所有的linq查詢。 「不支持的過濾器:所有({document} {subscribers} .Where(({document} {userId}!= \」1234 \「)))。 –

1

檢查2中是否存在的方法。驅動程序的X版本是:

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

或異步:

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