diff --git a/Benchmark/Benchmark.csproj b/Benchmark/Benchmark.csproj
index 40cbcf133..0917af5cb 100644
--- a/Benchmark/Benchmark.csproj
+++ b/Benchmark/Benchmark.csproj
@@ -14,7 +14,7 @@
-
+
diff --git a/MongoDB.Entities/Builders/Find.cs b/MongoDB.Entities/Builders/Find.cs
index d295a8489..3959fe3f0 100644
--- a/MongoDB.Entities/Builders/Find.cs
+++ b/MongoDB.Entities/Builders/Find.cs
@@ -151,7 +151,11 @@ public Find Match(Template template)
/// Case sensitivity of the search (optional)
/// Diacritic sensitivity of the search (optional)
/// The language for the search (optional)
- public Find Match(Search searchType, string searchTerm, bool caseSensitive = false, bool diacriticSensitive = false, string? language = null)
+ public Find Match(Search searchType,
+ string searchTerm,
+ bool caseSensitive = false,
+ bool diacriticSensitive = false,
+ string? language = null)
{
if (searchType != Search.Fuzzy)
{
@@ -461,7 +465,7 @@ void AddTxtScoreToProjection(string propName)
options.Projection =
options.Projection
- .Render(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry, Driver.Linq.LinqProvider.V3)
+ .Render(new(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry))
.Document.Add(propName, new BsonDocument { { "$meta", "textScore" } });
}
}
diff --git a/MongoDB.Entities/Builders/Update.cs b/MongoDB.Entities/Builders/Update.cs
index d483a8b2a..dc43fff98 100644
--- a/MongoDB.Entities/Builders/Update.cs
+++ b/MongoDB.Entities/Builders/Update.cs
@@ -179,7 +179,10 @@ public Update Match(Search searchType, string searchTerm, bool caseSensitive
/// The search point
/// Maximum distance in meters from the search point
/// Minimum distance in meters from the search point
- public Update Match(Expression> coordinatesProperty, Coordinates2D nearCoordinates, double? maxDistance = null, double? minDistance = null)
+ public Update Match(Expression> coordinatesProperty,
+ Coordinates2D nearCoordinates,
+ double? maxDistance = null,
+ double? minDistance = null)
{
return Match(f => f.Near(coordinatesProperty, nearCoordinates.ToGeoJsonPoint(), maxDistance, minDistance));
}
@@ -503,7 +506,7 @@ bool ShouldSetModDate()
Cache.HasModifiedOn &&
!Defs.Any(
d => d
- .Render(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry, Driver.Linq.LinqProvider.V3)
+ .Render(new(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry))
.ToString()
.Contains($"\"{Cache.ModifiedOnPropName}\""));
}
diff --git a/MongoDB.Entities/Builders/UpdateAndGet.cs b/MongoDB.Entities/Builders/UpdateAndGet.cs
index 55f195a3e..4dc435219 100644
--- a/MongoDB.Entities/Builders/UpdateAndGet.cs
+++ b/MongoDB.Entities/Builders/UpdateAndGet.cs
@@ -32,7 +32,7 @@ public class UpdateAndGet : UpdateBase where T : IEntity
{
readonly List> _stages = new();
FilterDefinition _filter = Builders.Filter.Empty;
- protected private readonly FindOneAndUpdateOptions options = new() { ReturnDocument = ReturnDocument.After };
+ private protected readonly FindOneAndUpdateOptions options = new() { ReturnDocument = ReturnDocument.After };
readonly IClientSessionHandle? _session;
readonly Dictionary? _globalFilters;
readonly Action>? _onUpdateAction;
@@ -107,7 +107,11 @@ public UpdateAndGet Match(Template template)
/// Case sensitivity of the search (optional)
/// Diacritic sensitivity of the search (optional)
/// The language for the search (optional)
- public UpdateAndGet Match(Search searchType, string searchTerm, bool caseSensitive = false, bool diacriticSensitive = false, string? language = null)
+ public UpdateAndGet Match(Search searchType,
+ string searchTerm,
+ bool caseSensitive = false,
+ bool diacriticSensitive = false,
+ string? language = null)
{
if (searchType != Search.Fuzzy)
{
@@ -457,7 +461,7 @@ bool ShouldSetModDate()
Cache.HasModifiedOn &&
!Defs.Any(
d => d
- .Render(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry, Driver.Linq.LinqProvider.V3)
+ .Render(new(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry))
.ToString()
.Contains($"\"{Cache.ModifiedOnPropName}\""));
}
diff --git a/MongoDB.Entities/Core/Cache.cs b/MongoDB.Entities/Core/Cache.cs
index 2fc3ad5a1..693fc2977 100644
--- a/MongoDB.Entities/Core/Cache.cs
+++ b/MongoDB.Entities/Core/Cache.cs
@@ -53,7 +53,10 @@ static void Initialize()
IdSetter = type.SetterForProp(IdPropName);
}
else
- throw new InvalidOperationException($"Type {type.FullName} must specify an Identity property. '_id', 'Id', 'ID', or [BsonId] annotation expected!");
+ {
+ throw new InvalidOperationException(
+ $"Type {type.FullName} must specify an Identity property. '_id', 'Id', 'ID', or [BsonId] annotation expected!");
+ }
Database = TypeMap.GetDatabase(type);
DbName = Database.DatabaseNamespace.DatabaseName;
@@ -135,9 +138,7 @@ internal static ProjectionDefinition CombineWithRequiredProps userProj = userProjection.Render(
- BsonSerializer.LookupSerializer(),
- BsonSerializer.SerializerRegistry,
- LinqProvider.V3).Document;
+ new(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry)).Document;
return Builders.Projection.Combine(_requiredPropsProjection, userProj);
}
diff --git a/MongoDB.Entities/Core/Watcher.cs b/MongoDB.Entities/Core/Watcher.cs
index b5c8d6484..ef6f701ca 100644
--- a/MongoDB.Entities/Core/Watcher.cs
+++ b/MongoDB.Entities/Core/Watcher.cs
@@ -95,16 +95,18 @@ internal Watcher(string name)
/// x => x.FullDocument.Prop1 == "SomeValue"
/// The max number of entities to receive for a single event occurence
/// Set to true if you don't want the complete entity details. All properties except the ID will then be null.
- /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to retrieve a ResumeToken.
+ ///
+ /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to
+ /// retrieve a ResumeToken.
+ ///
/// A cancellation token for ending the watching/change stream
- public void Start(
- EventType eventTypes,
- Expression, bool>>? filter = null,
- int batchSize = 25,
- bool onlyGetIDs = false,
- bool autoResume = true,
- CancellationToken cancellation = default)
- => Init(null, eventTypes, filter, null, batchSize, onlyGetIDs, autoResume, cancellation);
+ public void Start(EventType eventTypes,
+ Expression, bool>>? filter = null,
+ int batchSize = 25,
+ bool onlyGetIDs = false,
+ bool autoResume = true,
+ CancellationToken cancellation = default)
+ => Init(null, eventTypes, filter, null, batchSize, onlyGetIDs, autoResume, cancellation);
///
/// Starts the watcher instance with the supplied parameters. Supports projection.
@@ -113,16 +115,18 @@ public void Start(
/// A projection expression for the entity
/// x => x.FullDocument.Prop1 == "SomeValue"
/// The max number of entities to receive for a single event occurence
- /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to retrieve a ResumeToken.
+ ///
+ /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to
+ /// retrieve a ResumeToken.
+ ///
/// A cancellation token for ending the watching/change stream
- public void Start(
- EventType eventTypes,
- Expression> projection,
- Expression, bool>>? filter = null,
- int batchSize = 25,
- bool autoResume = true,
- CancellationToken cancellation = default)
- => Init(null, eventTypes, filter, projection, batchSize, false, autoResume, cancellation);
+ public void Start(EventType eventTypes,
+ Expression> projection,
+ Expression, bool>>? filter = null,
+ int batchSize = 25,
+ bool autoResume = true,
+ CancellationToken cancellation = default)
+ => Init(null, eventTypes, filter, projection, batchSize, false, autoResume, cancellation);
///
/// Starts the watcher instance with the supplied parameters
@@ -131,16 +135,18 @@ public void Start(
/// b => b.Eq(d => d.FullDocument.Prop1, "value")
/// The max number of entities to receive for a single event occurence
/// Set to true if you don't want the complete entity details. All properties except the ID will then be null.
- /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to retrieve a ResumeToken.
+ ///
+ /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to
+ /// retrieve a ResumeToken.
+ ///
/// A cancellation token for ending the watching/change stream
- public void Start(
- EventType eventTypes,
- Func>, FilterDefinition>> filter,
- int batchSize = 25,
- bool onlyGetIDs = false,
- bool autoResume = true,
- CancellationToken cancellation = default)
- => Init(null, eventTypes, filter(Builders>.Filter), null, batchSize, onlyGetIDs, autoResume, cancellation);
+ public void Start(EventType eventTypes,
+ Func>, FilterDefinition>> filter,
+ int batchSize = 25,
+ bool onlyGetIDs = false,
+ bool autoResume = true,
+ CancellationToken cancellation = default)
+ => Init(null, eventTypes, filter(Builders>.Filter), null, batchSize, onlyGetIDs, autoResume, cancellation);
///
/// Starts the watcher instance with the supplied parameters. Supports projection.
@@ -149,16 +155,18 @@ public void Start(
/// A projection expression for the entity
/// b => b.Eq(d => d.FullDocument.Prop1, "value")
/// The max number of entities to receive for a single event occurence
- /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to retrieve a ResumeToken.
+ ///
+ /// Set to false if you'd like to skip the changes that happened while the watching was stopped. This will also make you unable to
+ /// retrieve a ResumeToken.
+ ///
/// A cancellation token for ending the watching/change stream
- public void Start(
- EventType eventTypes,
- Expression> projection,
- Func>, FilterDefinition>> filter,
- int batchSize = 25,
- bool autoResume = true,
- CancellationToken cancellation = default)
- => Init(null, eventTypes, filter(Builders>.Filter), projection, batchSize, false, autoResume, cancellation);
+ public void Start(EventType eventTypes,
+ Expression> projection,
+ Func>, FilterDefinition>> filter,
+ int batchSize = 25,
+ bool autoResume = true,
+ CancellationToken cancellation = default)
+ => Init(null, eventTypes, filter(Builders>.Filter), projection, batchSize, false, autoResume, cancellation);
///
/// Starts the watcher instance with the supplied configuration
@@ -169,14 +177,13 @@ public void Start(
/// The max number of entities to receive for a single event occurence
/// Set to true if you don't want the complete entity details. All properties except the ID will then be null.
/// A cancellation token for ending the watching/change stream
- public void StartWithToken(
- BsonDocument resumeToken,
- EventType eventTypes,
- Expression, bool>>? filter = null,
- int batchSize = 25,
- bool onlyGetIDs = false,
- CancellationToken cancellation = default)
- => Init(resumeToken, eventTypes, filter, null, batchSize, onlyGetIDs, true, cancellation);
+ public void StartWithToken(BsonDocument resumeToken,
+ EventType eventTypes,
+ Expression, bool>>? filter = null,
+ int batchSize = 25,
+ bool onlyGetIDs = false,
+ CancellationToken cancellation = default)
+ => Init(resumeToken, eventTypes, filter, null, batchSize, onlyGetIDs, true, cancellation);
///
/// Starts the watcher instance with the supplied configuration. Supports projection.
@@ -187,14 +194,13 @@ public void StartWithToken(
/// x => x.FullDocument.Prop1 == "SomeValue"
/// The max number of entities to receive for a single event occurence
/// A cancellation token for ending the watching/change stream
- public void StartWithToken(
- BsonDocument resumeToken,
- EventType eventTypes,
- Expression> projection,
- Expression, bool>>? filter = null,
- int batchSize = 25,
- CancellationToken cancellation = default)
- => Init(resumeToken, eventTypes, filter, projection, batchSize, false, true, cancellation);
+ public void StartWithToken(BsonDocument resumeToken,
+ EventType eventTypes,
+ Expression> projection,
+ Expression, bool>>? filter = null,
+ int batchSize = 25,
+ CancellationToken cancellation = default)
+ => Init(resumeToken, eventTypes, filter, projection, batchSize, false, true, cancellation);
///
/// Starts the watcher instance with the supplied configuration
@@ -205,14 +211,13 @@ public void StartWithToken(
/// The max number of entities to receive for a single event occurence
/// Set to true if you don't want the complete entity details. All properties except the ID will then be null.
/// A cancellation token for ending the watching/change stream
- public void StartWithToken(
- BsonDocument resumeToken,
- EventType eventTypes,
- Func>, FilterDefinition>> filter,
- int batchSize = 25,
- bool onlyGetIDs = false,
- CancellationToken cancellation = default)
- => Init(resumeToken, eventTypes, filter(Builders>.Filter), null, batchSize, onlyGetIDs, true, cancellation);
+ public void StartWithToken(BsonDocument resumeToken,
+ EventType eventTypes,
+ Func>, FilterDefinition>> filter,
+ int batchSize = 25,
+ bool onlyGetIDs = false,
+ CancellationToken cancellation = default)
+ => Init(resumeToken, eventTypes, filter(Builders>.Filter), null, batchSize, onlyGetIDs, true, cancellation);
///
/// Starts the watcher instance with the supplied configuration. Supports projection.
@@ -223,24 +228,22 @@ public void StartWithToken(
/// b => b.Eq(d => d.FullDocument.Prop1, "value")
/// The max number of entities to receive for a single event occurence
/// A cancellation token for ending the watching/change stream
- public void StartWithToken(
- BsonDocument resumeToken,
- EventType eventTypes,
- Expression> projection,
- Func>, FilterDefinition>> filter,
- int batchSize = 25,
- CancellationToken cancellation = default)
- => Init(resumeToken, eventTypes, filter(Builders>.Filter), projection, batchSize, false, true, cancellation);
-
- void Init(
- BsonDocument? resumeToken,
- EventType eventTypes,
- FilterDefinition> filter,
- Expression>? projection,
- int batchSize,
- bool onlyGetIDs,
- bool autoResume,
- CancellationToken cancellation)
+ public void StartWithToken(BsonDocument resumeToken,
+ EventType eventTypes,
+ Expression> projection,
+ Func>, FilterDefinition>> filter,
+ int batchSize = 25,
+ CancellationToken cancellation = default)
+ => Init(resumeToken, eventTypes, filter(Builders>.Filter), projection, batchSize, false, true, cancellation);
+
+ void Init(BsonDocument? resumeToken,
+ EventType eventTypes,
+ FilterDefinition> filter,
+ Expression>? projection,
+ int batchSize,
+ bool onlyGetIDs,
+ bool autoResume,
+ CancellationToken cancellation)
{
if (IsInitialized)
throw new InvalidOperationException("This watcher has already been initialized!");
@@ -267,17 +270,17 @@ void Init(
if (filter != null)
{
throw new ArgumentException(
- "Filtering is not supported when watching for deletions " +
- "as the entity data no longer exists in the db " +
- "at the time of receiving the event.");
+ "Filtering is not supported when watching for deletions " +
+ "as the entity data no longer exists in the db " +
+ "at the time of receiving the event.");
}
if (projection != null)
{
throw new ArgumentException(
- "Projecting is not supported when watching for deletions " +
- "as the entity data no longer exists in the db " +
- "at the time of receiving the event.");
+ "Projecting is not supported when watching for deletions " +
+ "as the entity data no longer exists in the db " +
+ "at the time of receiving the event.");
}
}
@@ -286,9 +289,10 @@ void Init(
if (filter != null)
filters &= filter;
- var stages = new List(3) {
+ var stages = new List(3)
+ {
PipelineStageDefinitionBuilder.Match(filters),
- PipelineStageDefinitionBuilder.Project,ChangeStreamDocument>(
+ PipelineStageDefinitionBuilder.Project, ChangeStreamDocument>(
"""
{
_id: 1,
@@ -305,7 +309,8 @@ void Init(
pipeline = stages;
- options = new() {
+ options = new()
+ {
StartAfter = resumeToken,
BatchSize = batchSize,
FullDocument = onlyGetIDs ? ChangeStreamFullDocumentOption.Default : ChangeStreamFullDocumentOption.UpdateLookup,
@@ -320,10 +325,8 @@ void Init(
static ProjectionDefinition, ChangeStreamDocument> BuildProjection(Expression> projection)
{
var rendered = Builders.Projection
- .Expression(projection)
- .Render(BsonSerializer.SerializerRegistry.GetSerializer(),
- BsonSerializer.SerializerRegistry,
- Driver.Linq.LinqProvider.V3);
+ .Expression(projection)
+ .Render(new(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry));
BsonDocument doc = new()
{
@@ -355,9 +358,9 @@ public void ReStart(BsonDocument? resumeToken = null)
if (!CanRestart)
{
throw new InvalidOperationException(
- "This watcher has been aborted/cancelled. " +
- "The subscribers have already been purged. " +
- "Please instantiate a new watcher and subscribe to the events again.");
+ "This watcher has been aborted/cancelled. " +
+ "The subscribers have already been purged. " +
+ "Please instantiate a new watcher and subscribe to the events again.");
}
if (!IsInitialized)
@@ -387,6 +390,7 @@ async Task IterateCursorAsync()
try
{
using var cursor = await DB.Collection().WatchAsync(pipeline, options, cancelToken).ConfigureAwait(false);
+
while (!cancelToken.IsCancellationRequested && await cursor.MoveNextAsync(cancelToken).ConfigureAwait(false))
{
if (!cursor.Current.Any())
@@ -399,15 +403,14 @@ async Task IterateCursorAsync()
{
await OnChangesAsync.InvokeAllAsync(
cursor.Current
- .Where(d => d.OperationType != ChangeStreamOperationType.Invalidate)
- .Select(d => d.FullDocument)
- ).ConfigureAwait(false);
+ .Where(d => d.OperationType != ChangeStreamOperationType.Invalidate)
+ .Select(d => d.FullDocument)).ConfigureAwait(false);
}
OnChanges?.Invoke(
cursor.Current
- .Where(d => d.OperationType != ChangeStreamOperationType.Invalidate)
- .Select(d => d.FullDocument));
+ .Where(d => d.OperationType != ChangeStreamOperationType.Invalidate)
+ .Select(d => d.FullDocument));
if (OnChangesCSDAsync != null)
await OnChangesCSDAsync.InvokeAllAsync(cursor.Current).ConfigureAwait(false);
diff --git a/MongoDB.Entities/DBContext/DBContext.Pipeline.cs b/MongoDB.Entities/DBContext/DBContext.Pipeline.cs
index deb806d8f..f6e01131f 100644
--- a/MongoDB.Entities/DBContext/DBContext.Pipeline.cs
+++ b/MongoDB.Entities/DBContext/DBContext.Pipeline.cs
@@ -19,7 +19,10 @@ public partial class DBContext
/// The options for the aggregation. This is not required.
/// An optional cancellation token
/// Set to true if you'd like to ignore any global filters for this operation
- public Task> PipelineCursorAsync(Template template, AggregateOptions? options = null, CancellationToken cancellation = default, bool ignoreGlobalFilters = false) where T : IEntity
+ public Task> PipelineCursorAsync(Template template,
+ AggregateOptions? options = null,
+ CancellationToken cancellation = default,
+ bool ignoreGlobalFilters = false) where T : IEntity
=> DB.PipelineCursorAsync(MergeGlobalFilter(template, ignoreGlobalFilters), options, Session, cancellation);
///
@@ -32,7 +35,10 @@ public Task> PipelineCursorAsync(TemplateThe options for the aggregation. This is not required.
/// An optional cancellation token
/// Set to true if you'd like to ignore any global filters for this operation
- public Task> PipelineAsync(Template template, AggregateOptions? options = null, CancellationToken cancellation = default, bool ignoreGlobalFilters = false) where T : IEntity
+ public Task> PipelineAsync(Template template,
+ AggregateOptions? options = null,
+ CancellationToken cancellation = default,
+ bool ignoreGlobalFilters = false) where T : IEntity
=> DB.PipelineAsync(MergeGlobalFilter(template, ignoreGlobalFilters), options, Session, cancellation);
///
@@ -45,7 +51,10 @@ public Task> PipelineAsync(Template templa
/// The options for the aggregation. This is not required.
/// An optional cancellation token
/// Set to true if you'd like to ignore any global filters for this operation
- public Task PipelineSingleAsync(Template template, AggregateOptions? options = null, CancellationToken cancellation = default, bool ignoreGlobalFilters = false) where T : IEntity
+ public Task PipelineSingleAsync(Template template,
+ AggregateOptions? options = null,
+ CancellationToken cancellation = default,
+ bool ignoreGlobalFilters = false) where T : IEntity
=> DB.PipelineSingleAsync(MergeGlobalFilter(template, ignoreGlobalFilters), options, Session, cancellation);
///
@@ -58,7 +67,10 @@ public Task PipelineSingleAsync(Template templa
/// The options for the aggregation. This is not required.
/// An optional cancellation token
/// Set to true if you'd like to ignore any global filters for this operation
- public Task PipelineFirstAsync(Template template, AggregateOptions? options = null, CancellationToken cancellation = default, bool ignoreGlobalFilters = false) where T : IEntity
+ public Task PipelineFirstAsync(Template template,
+ AggregateOptions? options = null,
+ CancellationToken cancellation = default,
+ bool ignoreGlobalFilters = false) where T : IEntity
=> DB.PipelineFirstAsync(MergeGlobalFilter(template, ignoreGlobalFilters), options, Session, cancellation);
Template MergeGlobalFilter(Template template, bool ignoreGlobalFilters) where T : IEntity
@@ -71,7 +83,7 @@ Template MergeGlobalFilter(Template template
var filter = gFilter.filterDef switch
{
- FilterDefinition def => def.Render(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry, Driver.Linq.LinqProvider.V3),
+ FilterDefinition def => def.Render(new(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry)),
BsonDocument doc => doc,
string jsonString => BsonDocument.Parse(jsonString),
_ => null
@@ -81,6 +93,7 @@ Template MergeGlobalFilter(Template template
template.builder.Insert(1, $"{{$match:{filter}}},");
else
template.builder.Insert(template.builder.Length - 1, $",{{$match:{filter}}}");
+
return template;
}
}
\ No newline at end of file
diff --git a/MongoDB.Entities/MongoDB.Entities.csproj b/MongoDB.Entities/MongoDB.Entities.csproj
index c123ac700..2a8161d3a 100644
--- a/MongoDB.Entities/MongoDB.Entities.csproj
+++ b/MongoDB.Entities/MongoDB.Entities.csproj
@@ -2,7 +2,7 @@
- 23.1.1
+ 23.2.0
netstandard2.1
MongoDB.Entities
@@ -31,7 +31,7 @@
-
+
diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj
index e6e2ebf28..097ae2717 100644
--- a/Tests/Tests.csproj
+++ b/Tests/Tests.csproj
@@ -11,10 +11,10 @@
-
-
-
-
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/changelog.md b/changelog.md
index 6fb81051b..88738f568 100644
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,8 @@
### IMPROVEMENTS
-- upgrade mongodb driver to v2.28
+- upgrade mongodb driver to v2.30
+
+> NOTE: v2.30 is the last driver version for v2 series. In turn this will be the last release for v23 major version of MongoDB.Entities. v24 will switch to v3 of the official driver which has lots of breaking changes that are not backwards compatible.
[//]: # (### BREAKING CHANGES)
\ No newline at end of file