Skip to content

Commit 5b920c1

Browse files
committed
CSHARP-1373: added $sum expression support.
1 parent ec54850 commit 5b920c1

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

Docs/reference/content/reference/driver/expressions.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,15 @@ p => p.FavoriteNumbers.Count();
788788
{ $size: '$FavoriteNumbers' }
789789
```
790790

791+
#### $sum
792+
793+
```csharp
794+
p => p.FavoriteNumbers.Sum()
795+
```
796+
```json
797+
{ $sum: '$FavoriteNumbers' }
798+
```
799+
791800
### Variable Expressions
792801

793802
See the [MongoDB documentation]({{< docsref "meta/aggregation-quick-reference/#variable-expressions" >}}) for more information on each operator.

src/MongoDB.Driver.Tests/Linq/Translators/AggregateProjectTranslatorTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,28 @@ public async Task Should_translate_subtract_3_numbers()
948948
result.Value.Result.Should().Be(-23);
949949
}
950950

951+
[Test]
952+
[RequiresServer(MinimumVersion = "3.1.7")]
953+
public async Task Should_translate_sum()
954+
{
955+
var result = await Project(x => new { Result = x.M.Sum() });
956+
957+
result.Projection.Should().Be("{ Result: { \"$sum\": \"$M\" }, _id: 0 }");
958+
959+
result.Value.Result.Should().Be(11);
960+
}
961+
962+
[Test]
963+
[RequiresServer(MinimumVersion = "3.1.7")]
964+
public async Task Should_translate_sum_with_selector()
965+
{
966+
var result = await Project(x => new { Result = x.G.Sum(g => g.E.F) });
967+
968+
result.Projection.Should().Be("{ Result: { \"$sum\": \"$G.E.F\" }, _id: 0 }");
969+
970+
result.Value.Result.Should().Be(88);
971+
}
972+
951973
[Test]
952974
public async Task Should_translate_to_lower()
953975
{

src/MongoDB.Driver/Linq/Translators/AggregateLanguageTranslator.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,8 @@ private BsonValue TranslatePipeline(PipelineExpression node)
397397
TryTranslateContainsResultOperator(node, out result) ||
398398
TryTranslateCountResultOperator(node, out result) ||
399399
TryTranslateMaxResultOperator(node, out result) ||
400-
TryTranslateMinResultOperator(node, out result))
400+
TryTranslateMinResultOperator(node, out result) ||
401+
TryTranslateSumResultOperator(node, out result))
401402
{
402403
return result;
403404
}
@@ -789,6 +790,19 @@ private bool TryTranslateStringMethodCall(MethodCallExpression node, out BsonVal
789790
return false;
790791
}
791792

793+
private bool TryTranslateSumResultOperator(PipelineExpression node, out BsonValue result)
794+
{
795+
var resultOperator = node.ResultOperator as SumResultOperator;
796+
if (resultOperator != null)
797+
{
798+
result = new BsonDocument("$sum", TranslateValue(node.Source));
799+
return true;
800+
}
801+
802+
result = null;
803+
return false;
804+
}
805+
792806
private static bool TryFindSerializationExpression(MethodCallExpression node, out ISerializationExpression serializationExpression)
793807
{
794808
var current = node.Arguments[0];

0 commit comments

Comments
 (0)