C# MongoDB驱动程序 - 如何使用UpdateDefinitionBuilder?

27

我找到了一种与mongodb的UpdateDefinitionBuilders一起使用的方法,但是文档并没有提供太多帮助...

我需要能够动态构建我的更新查询,所以我考虑这样做:

var update = Builders<Product>.Update;

update.Set("add A update");

if ()
    update.Set("add X update");
else
    update.Set("add Y update");

update.Set("add B update");

if ()
    update.Set("add Z update");
else
    update.Set("add P update");

Collection.UpdateOneAsync(filter, update, updateOptions);

但它会导致编译错误:

无法从UpdateDefinitionBuilder转换为UpdateDefinition

我查看了,但找不到一个解决方案来处理这个UpdateDefinitionBuilders

请问有人能提供一个如何使用这个类的代码示例吗?

1个回答

53

如果您只需要更新多个属性,可以在更新构建器上调用Set,然后对Set扩展方法进行后续调用。您可以使用lambda表达式或属性名称。

var update = Builders<Product>.Update
    .Set(p => Name, "Name value")
    .Set(p => Description, "Description value");

collection.UpdateOneAsync(filter, update, updateOptions);
如果您想有条件地更新某些属性,您应该创建一组更新并将它们组合起来:

如果要有条件地更新某些属性,应创建一个更新集合,然后将其组合:

var update = Builders<Product>.Update;
var updates = new List<UpdateDefinition<Product>>();

updates.Add(update.Set("propertyA", "add A update"));

if ()
    updates.Add(update.Set("propertyX", "add X update"));
else
    updates.Add(update.Set("propertyY", "add Y update"));

updates.Add(update.Set(p => p.PropertyB, "add B update"));

if ()
    updates.Add(update.Set(p => p.PropertyZ, "add Z update"));
else
    updates.Add(update.Set(p => p.PropertyP, "add P update"));

Collection.UpdateOneAsync(filter, update.Combine(updates), updateOptions);

在最新版本的库中,.Set() 返回UpdateDefinition而不是UpdateDefinitionBuilder,因此无法将其与另一个.Set()链接。它是否更改或者我漏掉了什么?谢谢... - Václav Mikeska
1
@VáclavMikeska 在最新版本中它周围并没有改变,但是有一个扩展方法 https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/UpdateDefinitionBuilder.cs#L684-L688 可以用于 UpdateDefinition。确保在后续调用中调用扩展方法。 - Andrii Litvinov
完美的解决方案 :) - Zafar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接