[英]Query MongoDB Using 'ObjectId'
我已將document
插入到 MongoDB 中,而沒有id
。 我想通過搜索默認分配的MongoDB ObjectId
來檢索它們。
這是我的嘗試-
var query_id = Query.EQ("_id", "50ed4e7d5baffd13a44d0153");
var entity = dbCollection.FindOne(query_id);
return entity.ToString();
我收到以下錯誤-
發生“System.NullReferenceException”類型的第一次機會異常
問題是什么?
您需要創建ObjectId
一個實例,然后使用該實例進行查詢,否則您的查詢會將ObjectId
與字符串進行比較並且無法找到匹配的文檔。
這應該有效:
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 表達式進一步簡化代碼 -
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);
當您要實際按對象 ID 進行搜索時,需要 ObjectId 對象,否則將 string 與 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 參數是該方法的一個參數。 如果您需要這樣:
public async Task<YourTable> Find(string id)
{
ObjectId internalId = GetMongoId.GetInternalId(id);
return await YourContext.YourTable.Find(c => c.InternalId == internalId).FirstOrDefaultAsync();
}
希望它也有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.