Skip to content

Commit 9f29350

Browse files
committed
CSHARP-5672: Support sorting by value in updateDefinition builders
1 parent ba628c3 commit 9f29350

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/MongoDB.Driver/SortDefinitionBuilder.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,15 @@ public static SortDefinition<TDocument> MetaTextScore<TDocument>(this SortDefini
130130
/// <typeparam name="TDocument">The type of the document.</typeparam>
131131
public sealed class SortDefinitionBuilder<TDocument>
132132
{
133+
/// <summary>
134+
/// Creates a value ascending sort.
135+
/// </summary>
136+
/// <returns>An ascending sort.</returns>
137+
public SortDefinition<TDocument> Ascending()
138+
{
139+
return new NoFieldDirectionalSortDefinition<TDocument>(SortDirection.Ascending);
140+
}
141+
133142
/// <summary>
134143
/// Creates an ascending sort.
135144
/// </summary>
@@ -170,6 +179,15 @@ public SortDefinition<TDocument> Combine(IEnumerable<SortDefinition<TDocument>>
170179
return new CombinedSortDefinition<TDocument>(sorts);
171180
}
172181

182+
/// <summary>
183+
/// Creates a value descending sort.
184+
/// </summary>
185+
/// <returns>A descending sort.</returns>
186+
public SortDefinition<TDocument> Descending()
187+
{
188+
return new NoFieldDirectionalSortDefinition<TDocument>(SortDirection.Descending);
189+
}
190+
173191
/// <summary>
174192
/// Creates a descending sort.
175193
/// </summary>
@@ -288,4 +306,26 @@ public override BsonDocument Render(RenderArgs<TDocument> args)
288306
return new BsonDocument(renderedField.FieldName, value);
289307
}
290308
}
309+
310+
internal sealed class NoFieldDirectionalSortDefinition<TDocument> : SortDefinition<TDocument>
311+
{
312+
private readonly SortDirection _direction;
313+
314+
public NoFieldDirectionalSortDefinition(SortDirection direction)
315+
{
316+
_direction = direction;
317+
}
318+
319+
public override BsonDocument Render(RenderArgs<TDocument> args)
320+
{
321+
BsonValue value = _direction switch
322+
{
323+
SortDirection.Ascending => 1,
324+
SortDirection.Descending => -1,
325+
_ => throw new InvalidOperationException("Unknown value for " + typeof(SortDirection) + ".")
326+
};
327+
328+
return new BsonDocument("direction", value);
329+
}
330+
}
291331
}

src/MongoDB.Driver/UpdateDefinitionBuilder.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1685,7 +1685,13 @@ public override BsonValue Render(RenderArgs<TDocument> args)
16851685

16861686
if (_sort != null)
16871687
{
1688-
document["$push"][renderedField.FieldName]["$sort"] = _sort.Render(args.WithNewDocumentType((IBsonSerializer<TItem>)itemSerializer));
1688+
var newArgs = args.WithNewDocumentType((IBsonSerializer<TItem>)itemSerializer);
1689+
1690+
var renderedSort = _sort is NoFieldDirectionalSortDefinition<TItem>
1691+
? _sort.Render(newArgs)["direction"]
1692+
: _sort.Render(newArgs);
1693+
1694+
document["$push"][renderedField.FieldName]["$sort"] = renderedSort;
16891695
}
16901696

16911697
return document;

0 commit comments

Comments
 (0)