2013-01-14 17 views
20

Wstawiłem document s do MongoDB bez id. Chcę je odzyskać, przeszukując ich numer MongoDB ObjectId, który został przypisany domyślnie.Zapytanie MongoDB przy użyciu "ObjectId"

Oto moja attempt-

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

i dostaję następujący ERROR-

Pierwsza szansa wyjątek typu 'System.NullReferenceException' wystąpił

Jaki jest problem ?

Odpowiedz

44

Musisz utworzyć instancję o numerze ObjectId, a następnie zapytać, używając tej instancji, w przeciwnym razie zapytanie porównuje ciągi z ObjectId s i nie uda się znaleźć pasujących dokumentów.

To powinno działać:

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

Ta odpowiedź jest niemal prawidłowe. Przynajmniej w C# wygląda na to, że nie ma już metody FindOne(). Zastąp go FindOneAs(). Oto link do dobrego przykładu, ten używa FindAs(), ale jest to ta sama zasada: http://stackoverflow.com/a/12345580/2705003 – kbpontius

+0

Nie ma już metody FineAs lub FindOneAs, odpowiedź Minhas Kamal powinna zamiast tego należy się do niego odwoływać –

1

Wybrana odpowiedź jest poprawna. Dla każdego, mylone przez Query.EQ, tu jest inny sposób napisać podstawowe aktualizacji (aktualizacje cały dokument MongoDB):

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

jest potrzebne Przedmiotem ObjectId kiedy chcesz faktycznie szukać według identyfikatora obiektu, w przeciwnym razie porównuje ciąg do typu objectid i nie będzie się zgadzał. W ten sposób Mongo jest bardzo surowe, niezależnie od tego, czy nazwa pola jest poprawna.

14

W C# do najnowszej oficjalnej MongoDB.Driver pisać this-

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

Możemy osiągnąć ten sam efekt bez konwersji id ze sznurkiem do ObjectId. Ale wtedy będziemy musieli dodać atrybut [BsonRepresentation(BsonType.ObjectId)] przed id w klasie modelu.

Kod może być nawet jeszcze bardziej uprościć stosując lambda ekspresji -

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