使用官方C#驱动程序在Mongo DB中升级

使用官方C#驱动程序在Mongo DB中升级,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,在mongodb的官方文档中,他们提到upsert,因此编写upsert命令而不是: if (_campaignRepo.Exists(camp)) { _campaignRepo.DeleteByIdAndSystemId(camp); } _campaignRepo.Save(camp); 如果可能的话,可以在db级别实现该逻辑。那么,如果有upsert,该怎么做呢?MongoDB C#驱动程序的第2版需要在write命令中设置IsUpsert标志。此示例将上载整个文档 var

在mongodb的官方文档中,他们提到upsert,因此编写upsert命令而不是:

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

_campaignRepo.Save(camp);

如果可能的话,可以在db级别实现该逻辑。那么,如果有upsert,该怎么做呢?

MongoDB C#驱动程序的第2版需要在write命令中设置
IsUpsert
标志。此示例将上载整个文档

var newDoc=newbsondocument{{{u id',123},{“someKey”,“someValue”};
var result=await collection.ReplaceOneAsync(
过滤器:新的BsonDocument(“\u id”,123),
选项:新的替换选项{IsUpsert=true},
替换:新文档);
MongoDB C#驱动程序的版本1在
Save
命令中实现此逻辑

var newDoc=newbsondocument{{{u id',123},{“someKey”,“someValue”};
collection.Save(newDoc);
Save方法是Insert和Update的组合。如果文档的Id成员有一个值,则假定它是一个现有文档,并且保存调用会更新文档(设置Upsert标志以防它实际上是一个新文档)。否则,假定它是一个新文档,并在首次将新生成的唯一值分配给Id成员后插入保存调用

参考:


注意:但是,这确实需要Id字段的正确映射。更多信息请参见此处:

以下代码来自正在运行的应用程序:

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 update标志传递给它即可

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

该代码改编自一个工作应用程序(为清晰起见缩短)

从驱动程序的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

该操作是否适用于嵌套集合来检查该操作是插入还是更新?你试过了吗?因为在我的情况下,它不适用于他们,所以在新的API.Updated中,这是不可能的。虽然我认为新的API使upsert命令更难使用,但是如果newDocs ID为null,即它是一个insert,会传递给过滤器什么?只是一个空的bson文档?@BenCr如果您只是执行正常插入而不是upsert,那么您应该使用
InsertOneAsync
方法。这不需要指定ID字段,因为MongoDB将在insert期间创建一个ID字段,但是您也可以创建这些ID,而无需像GUID一样访问数据库,所以这取决于您自己。这里的C#驱动程序文档中有更多信息:我试图使用ReplaceOneAsync,但它引发了一个异常:“元素名称“”无效”,我使用的是updateOneasync筛选器,它可以工作,但不能与replaceone一起工作。你能帮我吗?UpdateOptions是obselete,请使用新的替换选项{IsUpsert=true});现在