簡體   English   中英

使用官方 C# 驅動程序在 Mongo DB 中更新

[英]Upserting in Mongo DB using official C# driver

在 mongodb 的官方文檔中他們提到了 upserts,所以寫一個 upsert 命令而不是:

if (_campaignRepo.Exists(camp))
{
    _campaignRepo.DeleteByIdAndSystemId(camp);
}

_campaignRepo.Save(camp);

如果可能的話,可以在數據庫級別實現該邏輯的東西。 那么如果有一個 upsert,有什么方法呢?

MongoDB C# 驅動程序的版本 2需要在寫入命令中設置IsUpsert標志。 此示例將插入整個文檔。

var newDoc = new BsonDocument { { "_id", 123 }, { "someKey", "someValue" } };
var result = await collection.ReplaceOneAsync(
                filter: new BsonDocument("_id", 123),
                options: new ReplaceOptions { IsUpsert = true },
                replacement: newDoc);

MongoDB C# 驅動程序的第 1 版Save命令中實現了此邏輯。

var newDoc = new BsonDocument { { "_id", 123 }, { "someKey", "someValue" } };
collection.Save(newDoc);

Save 方法是 Insert 和 Update 的組合。 如果文檔的 Id 成員有一個值,則假定它是一個現有文檔,並且 Save 調用該文檔的 Update(設置 Upsert 標志以防它實際上是一個新文檔)。 否則,它被假定為一個新文檔,並且 Save 在第一次將新生成的唯一值分配給 Id 成員后調用 Insert。

參考: http : //mongodb.github.io/mongo-csharp-driver/1.11/driver/#save-tdocument-method

注意:這確實需要正確映射 Id 字段。 更多信息在這里: http : //mongodb.github.io/mongo-csharp-driver/1.11/serialization/#identifying-the-id-field-or-property

從驅動程序的 v2.0 開始,有一個新的僅異步 API。 不應再使用舊 API,因為它是新 API 的阻塞外觀,已棄用。

當前推薦的插入文檔的方法是調用並等待ReplaceOneAsync並打開IsUpsert標志和匹配相關文檔的過濾器:

Hamster hamster = ...
var replaceOneResult = await collection.ReplaceOneAsync(
    doc => doc.Id == hamster.Id, 
    hamster, 
    new UpdateOptions {IsUpsert = true});

您可以通過查看ReplaceOneResult.MatchedCount來檢查操作是插入還是更新:

以下代碼來自一個工作應用程序:

weekplanStore.Update(
    Query.EQ("weekNumber", week),
    Update.Replace(rawWeekPlan),
    UpdateFlags.Upsert);

weekplanStore 是我的 MongoDB 集合,代碼將更新在第一個參數中使用查詢找到的文檔,或者如果沒有找到則插入一個新文檔。 “技巧”是使用 UpdateFlags.Upsert 修飾符。

rawWeekPlan 是插入或更新的對象,具有以下類型:

private class RawWeekPlan
{
    public ObjectId id;
    public int weekNumber;
    public WeekPlanEntry[] entries;
}

並被驅動自動變成bson。

您可以使用常規更新命令,但只需將 Upsert 更新標志傳遞給它

MongoCollection collection = db.GetCollection("matches");
var query = new QueryDocument("recordId", recordId);

var update = Update.Set("FirstName", "John").Set("LastName","Doe");
matchCollection.Update(query, update, UpdateFlags.Upsert, SafeMode.False);

該代碼改編自一個工作應用程序(為了清楚起見縮短了)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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