2013-01-14 14 views
20

idなしでdocumentをMongoDBに挿入しました。そして、私は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が文字列と比較され、一致するドキュメントが見つかりません。

これは動作するはずです:

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); 

、それ以外の場合は、 stringをobjectid型と比較していて、一致しません。 Mongoは、フィールド名が正しいかどうかにかかわらず、このように非常に型厳密です。最新の公式MongoDB.Driverため

14

C#たちはObjectIdに文字列からidを変換せずに同じ結果を達成することができますthis-

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

を書きます。しかし、id属性の前に[BsonRepresentation(BsonType.ObjectId)]をモデルクラスに追加する必要があります。この回答はほぼ正しい

var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault(); 
return entity.ToString(); 
関連する問題