如何使用公式(或表达式)更新值使用Mongo DB C#驱动程序4.2



我对MongoDb(和MongoDb C#驱动程序(很陌生,最近,我们正在尝试实现一个更新,其中我们使用字段和变量(方法参数(的值来更新几个字段。

基本上,我们的文档类似于

公共类库存{

公共字符串_id;

公共十进制数量;

公共十进制TotalCost;

}

我们要做的是根据传递的值(数量(更新数量和totalCost。

(1( 总成本=(数量*(总成本/数量((

(2( 数量-=数量

这背后的逻辑是,我们希望保留商品的平均成本。注意:步骤(1(中的数量字段的值应使用原始值,而不是步骤(2(的结果。

我们可以使用两个查询来实现这一点,但在我们的情况下,我们只需要在一个调用中执行此逻辑,因为有不同的线程将更新单个项。

我已经阅读了关于聚合和投影(以及使用表达式(的文档,但我似乎不知道如何使用投影结果或将其组合到聚合更新中。

尝试此投影以返回应从totalCost 中扣除的值

Builders.Projection.Expression(e=>(e.totalCost/e.quantity(*-数量(;

谢谢你们,希望你们能为我们指明正确的方向。

这相当于我们在mongo shell中试图实现的目标,前提是数量=500。

db.inventory.updateOne({_id:"1"},[{"$set":{"TotalCost":{"$add":["$TotalCosts",{"$multiply":[-500,{"$divide":["$SotalCost","$Quantity"]}]}}](

目前没有用于创建更新管道的类型安全的辅助方法。然而,您可以像使用控制台一样使用相同的json-ish语法。下面是一些C#代码示例。

// Some id to filter on
var id = ObjectId.GenerateNewId();

var db = client.GetDatabase("test");
var inventory = db.GetCollection<Inventory>("inventory");

var filter = Builders<Inventory>.Filter
.In(x => x.Id, id);
var update = Builders<Inventory>.Update.Pipeline(
new PipelineStagePipelineDefinition<Inventory, Inventory>(
new PipelineStageDefinition<Inventory, Inventory>[]
{
@"{ ""$set"": { ""TotalCost"": { ""$add"": [""$TotalCost"", { ""$multiply"": [-500, { ""$divide"": [""$TotalCost"", ""$Quantity""] }] }] } } }",
}));
await inventory.UpdateOneAsync(filter, update)
.ConfigureAwait(false);

最新更新