簡體   English   中英

使用“ObjectId”查詢 MongoDB

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM