2013-01-14 3 views
20

id없이 document을 MongoDB에 삽입했습니다. 그리고 을 검색하여 검색합니다. 은 기본값이입니다. 여기 'ObjectId'를 사용하여 MongoDB 쿼리

내 시도 -

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

내가 오류 -

유형의 첫 번째 예외 'System.NullReferenceException'를 다음 얻을 문제가 무엇

발생 ?

답변

44

ObjectId의 인스턴스를 만든 다음 해당 인스턴스를 사용하여 쿼리해야합니다. 그렇지 않으면 ObjectId을 문자열과 비교하여 일치하는 문서를 찾지 못합니다.

이 작동합니다 :

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

-

이 코드는 더욱 람다 식을 사용 단순화 될 수있다. 최소한 C#에서는 FindOne() 메서드가 더 이상 존재하지 않는 것처럼 보입니다. 대신 FindOneAs()로 바꿉니다. 다음은 FindAs()를 사용하는 좋은 예에 대한 링크입니다. 그러나 동일한 원리입니다. http://stackoverflow.com/a/12345580/2705003 – kbpontius

+0

이제는 더 이상 FineAs 또는 FindOneAs 메서드가 없으므로 Minhas Kamal 응답에 대신 참조되다. –

1

선택한 대답은 올바른 것입니다. Query.EQ 혼란 누군가를 위해, 여기에 기본 업데이트 (전체 MongoDB의 문서를 업데이트)를 작성하는 또 다른 방법이다 :

당신이 실제로 오브젝트 ID로 검색 할 때 ObjectId가 객체가 필요
string mongoDocumentID = "123455666767778"; 
var query = new QueryDocument("_id", ObjectId.Parse(mongoDocumentID)); 
var update = new UpdateDocument { { "$set", documentToSave } }; 
mongoCollection.Update(query, update, UpdateFlags.Multi); 

, 그렇지 않으면 문자열을 objectid 유형과 비교 중이며 일치하지 않습니다. Mongo는 필드 이름이 올바른지 여부와 관계없이 이런 방식으로 매우 엄격합니다.

14

최신 공식 에 대한 C#에서 MongoDB.Driver는 this-

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

우리는 ObjectId에 문자열에서 id을 변환하지 않고 동일한 결과를 얻을 수 있습니다 쓰기. 그런 다음 모델 클래스에 id 속성 앞에 [BsonRepresentation(BsonType.ObjectId)]을 추가해야합니다. 대답이 거의 정확

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