Как использовать формулу (или выражение) для обновления значения с помощью Mon go DB C# Drivers 4.2? - PullRequest
1 голос
/ 12 июля 2020

Я новичок в MongoDb (и MongoDb C# Drivers), и в последнее время мы пытаемся реализовать обновление, в котором мы используем значение поля и переменную (параметр метода) для обновления нескольких полей.

По сути, наш do c выглядит примерно так:

publi c class Inventory {

publi c string _id;

publi c decimal Quantity;

publi c decimal TotalCost;

}

Что мы хотим сделать, так это обновить количество и totalCost на основе переданное значение (кол-во).

(1) TotalCost - = (qty * (TotalCost / Quantity))

(2) Quantity - = Qty

Logi c за этим стоит то, что мы хотим сохранить среднюю стоимость нашего товара. Обратите внимание: значение поля количества на шаге (1) должно использовать исходное значение, а не результат шага (2).

Мы можем реализовать это, используя 2 запроса, но в нашем случае нам нужно выполнить это logi c только за один вызов, так как есть разные потоки, которые обновляют один элемент.

Я читал документы об агрегировании и проекции (и использовании выражений), но я не могу понять, как использовать или объединить результат проекции в агрегированное обновление.

Пробовал эту проекцию, чтобы вернуть значение, которое должно быть вычтено из totalCost

Builders.Projection.Expression (e => ( e.totalCost / e.quantity) * -qty);

Спасибо и надеюсь, что вы, ребята, укажете нам правильное направление.

Вот что мы имеем пытается достичь в оболочке mon go при условии, что qty = 500.

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

1 Ответ

0 голосов
/ 13 июля 2020

В настоящее время нет типобезопасных вспомогательных методов для создания конвейеров обновления. Однако вы можете просто использовать тот же синтаксис json -i sh, что и для консоли. Вот пример кода 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...