2013-01-14 101 views
20

我已將document s插入到MongoDB中,但沒有id。我想通過搜索MongoDB ObjectId來檢索它們,它們的默認已被分配爲使用'ObjectId'查詢MongoDB

這裏是我的attempt-

var query_id = Query.EQ("_id", "50ed4e7d5baffd13a44d0153"); 
var entity = dbCollection.FindOne(query_id); 
return entity.ToString(); 

,我得到以下錯誤 -

類型的第一個機會異常 'System.NullReferenceException' 發生

是什麼問題?

回答

44

您需要創建ObjectId的實例,然後使用該實例進行查詢,否則您的查詢會將ObjectId s與字符串進行比較,並且無法找到匹配的文檔。

這應該工作:

var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153")); 
var entity = dbCollection.FindOne(query_id); 
return entity.ToString(); 
+3

此答案是接近正確的 -

代碼甚至可以進一步使用lambda表達式簡化。至少在C#中,似乎不再有FindOne()方法。用FindOneAs()代替它。這裏有一個很好的例子,這個使用FindAs()的鏈接,但它是相同的原理:http://stackoverflow.com/a/12345580/2705003 – kbpontius

+0

現在不再有一個FineAs或FindOneAs方法,Minhas Kamal答案應該被引用 –

1

選擇的答案是正確的。對於任何由Query.EQ迷惑,這裏是另一種方式來寫一個基本的更新(更新整個mongodb的文件):

string mongoDocumentID = "123455666767778"; 
var query = new QueryDocument("_id", ObjectId.Parse(mongoDocumentID)); 
var update = new UpdateDocument { { "$set", documentToSave } }; 
mongoCollection.Update(query, update, UpdateFlags.Multi); 

當你想實際對象ID進行搜索時所需要的的ObjectId對象,否則將字符串與objectid類型進行比較,並且不匹配。不管字段名是否正確,Mongo在這種情況下都非常嚴格。

14

C#的最新官方MongoDB.Driver寫這個 -

var filter_id = Builders<MODEL_NAME>.Filter.Eq("id", ObjectId.Parse("50ed4e7d5baffd13a44d0153")); 
var entity = dbCollection.Find(filter).FirstOrDefault(); 
return entity.ToString(); 

我們可以實現相同的結果,而不從字符串轉換idObjectId。但是,我們必須在模型類中的id屬性之前添加[BsonRepresentation(BsonType.ObjectId)]

var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault(); 
return entity.ToString();