document
なしでid
sをMongoDBに挿入しました。そして、割り当てられた MongoDB ObjectId
を検索して、それらを取得しますデフォルト。
これが私の試みです
var query_id = Query.EQ("_id", "50ed4e7d5baffd13a44d0153");
var entity = dbCollection.FindOne(query_id);
return entity.ToString();
そして、私は次のエラーを受け取ります-
タイプ 'System.NullReferenceException'のファーストチャンス例外が発生しました
何が問題ですか?
ObjectId
のインスタンスを作成し、そのインスタンスを使用してクエリを実行する必要があります。そうしないと、クエリはObjectId
sを文字列と比較し、一致するドキュメントが見つかりません。
これは動作するはずです:
var query_id = Query.EQ("_id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.FindOne(query_id);
return entity.ToString();
C#最新の公式MongoDB.Driverでこれを書く
_var filter_id = Builders<MODEL_NAME>.Filter.Eq("id", ObjectId.Parse("50ed4e7d5baffd13a44d0153"));
var entity = dbCollection.Find(filter).FirstOrDefault();
return entity.ToString();
_
id
を文字列からObjectId
に変換しなくても同じ結果を得ることができます。ただし、モデルクラスのid
属性の前に[BsonRepresentation(BsonType.ObjectId)]
を追加する必要があります。
lambda expression-を使用して、コードをさらに簡素化することもできます。
_var entity = dbCollection.Find(document => document.id == "50ed4e7d5baffd13a44d0153").FirstOrDefault();
return entity.ToString();
_
あなたが2018年にここにいて、まだ機能するコピー/貼り付けコードまたは純粋な文字列構文が必要な場合;
[Fact]
public async Task QueryUsingObjectId()
{
var filter = Builders<CosmosParkingFactory>.Filter.Eq("_id", new ObjectId("5b57516fd16cb04bfc35fcc6"));
var entity = stocksCollection.Find(filter);
var stock = await entity.SingleOrDefaultAsync();
Assert.NotNull(stock);
var idString = "5b57516fd16cb04bfc35fcc6";
var stringFilter = "{ _id: ObjectId('" + idString + "') }";
var entityStringFiltered = stocksCollection.Find(stringFilter);
var stockStringFiltered = await entityStringFiltered.SingleOrDefaultAsync();
Assert.NotNull(stockStringFiltered);
}
選択した答えは正しいです。 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);
ObjectIdオブジェクトは、オブジェクトIDで実際に検索する場合に必要です。そうでない場合は、文字列をobjectidタイプと比較しており、一致しません。 Mongoは、フィールド名が正しいかどうかに関係なく、このように非常に型が厳密です。
この方法でもできます
public static ObjectId GetInternalId(string id)
{
if (!ObjectId.TryParse(id, out ObjectId internalId))
internalId = ObjectId.Empty;
return internalId;
}
あなたの方法では、このようなことをすることができます
ObjectId internalId = GetMongoId.GetInternalId(id);
return await YourContext.YourTable.Find(c => c.InternalId == internalId).FirstOrDefaultAsync();
注:GetInternalIdのid paramは、そのメソッドのパラメーターです。これが必要な場合:
public async Task<YourTable> Find(string id)
{
ObjectId internalId = GetMongoId.GetInternalId(id);
return await YourContext.YourTable.Find(c => c.InternalId == internalId).FirstOrDefaultAsync();
}
それが役に立てば幸いです。