/* Copyright 2010-present MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver.Core.Misc; using MongoDB.Driver.Linq; namespace MongoDB.Driver { /// /// Base class for implementors of . /// /// The type of the document. public abstract class MongoCollectionBase : IMongoCollection { /// public abstract CollectionNamespace CollectionNamespace { get; } /// public abstract IMongoDatabase Database { get; } /// public abstract IBsonSerializer DocumentSerializer { get; } /// public abstract IMongoIndexManager Indexes { get; } /// public abstract MongoCollectionSettings Settings { get; } /// public virtual IAsyncCursor Aggregate(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual IAsyncCursor Aggregate(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task> AggregateAsync(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task> AggregateAsync(IClientSessionHandle session, PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual BulkWriteResult BulkWrite(IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual BulkWriteResult BulkWrite(IClientSessionHandle session, IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task> BulkWriteAsync(IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task> BulkWriteAsync(IClientSessionHandle session, IEnumerable> requests, BulkWriteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// [Obsolete("Use CountDocuments or EstimatedDocumentCount instead.")] public virtual long Count(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// [Obsolete("Use CountDocuments or EstimatedDocumentCount instead.")] public virtual long Count(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// [Obsolete("Use CountDocumentsAsync or EstimatedDocumentCountAsync instead.")] public abstract Task CountAsync(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// [Obsolete("Use CountDocumentsAsync or EstimatedDocumentCountAsync instead.")] public virtual Task CountAsync(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual long CountDocuments(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual long CountDocuments(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual Task CountDocumentsAsync(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual Task CountDocumentsAsync(IClientSessionHandle session, FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual DeleteResult DeleteMany(FilterDefinition filter, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteMany(filter, null, cancellationToken); } /// public virtual DeleteResult DeleteMany(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteMany(filter, options, requests => BulkWrite(requests, null, cancellationToken)); } /// public virtual DeleteResult DeleteMany(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteMany(filter, options, requests => BulkWrite(session, requests, null, cancellationToken)); } private DeleteResult DeleteMany(FilterDefinition filter, DeleteOptions options, Func>, BulkWriteResult> bulkWriteFunc) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteManyModel(filter) { Collation = options.Collation }; try { var result = bulkWriteFunc(new[] { model }); return DeleteResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual Task DeleteManyAsync(FilterDefinition filter, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteManyAsync(filter, null, cancellationToken); } /// public virtual Task DeleteManyAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteManyAsync(filter, options, requests => BulkWriteAsync(requests, null, cancellationToken)); } /// public virtual Task DeleteManyAsync(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteManyAsync(filter, options, requests => BulkWriteAsync(session, requests, null, cancellationToken)); } private async Task DeleteManyAsync(FilterDefinition filter, DeleteOptions options, Func>, Task>> bulkWriteFuncAsync) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteManyModel(filter) { Collation = options.Collation }; try { var result = await bulkWriteFuncAsync(new[] { model }).ConfigureAwait(false); return DeleteResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual DeleteResult DeleteOne(FilterDefinition filter, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteOne(filter, null, cancellationToken); } /// public virtual DeleteResult DeleteOne(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteOne(filter, options, requests => BulkWrite(requests, null, cancellationToken)); } /// public virtual DeleteResult DeleteOne(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteOne(filter, options, requests => BulkWrite(session, requests, null, cancellationToken)); } private DeleteResult DeleteOne(FilterDefinition filter, DeleteOptions options, Func>, BulkWriteResult> bulkWrite) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteOneModel(filter) { Collation = options.Collation }; try { var result = bulkWrite(new[] { model }); return DeleteResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual Task DeleteOneAsync(FilterDefinition filter, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteOneAsync(filter, null, cancellationToken); } /// public virtual Task DeleteOneAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteOneAsync(filter, options, requests => BulkWriteAsync(requests, null, cancellationToken)); } /// public virtual Task DeleteOneAsync(IClientSessionHandle session, FilterDefinition filter, DeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return DeleteOneAsync(filter, options, requests => BulkWriteAsync(session, requests, null, cancellationToken)); } private async Task DeleteOneAsync(FilterDefinition filter, DeleteOptions options, Func>, Task>> bulkWriteAsync) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteOneModel(filter) { Collation = options.Collation }; try { var result = await bulkWriteAsync(new[] { model }).ConfigureAwait(false); return DeleteResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual IAsyncCursor Distinct(FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual IAsyncCursor Distinct(IClientSessionHandle session, FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task> DistinctAsync(FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task> DistinctAsync(IClientSessionHandle session, FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual long EstimatedDocumentCount(EstimatedDocumentCountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual Task EstimatedDocumentCountAsync(EstimatedDocumentCountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual IAsyncCursor FindSync(FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual IAsyncCursor FindSync(IClientSessionHandle session, FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task> FindAsync(FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task> FindAsync(IClientSessionHandle session, FilterDefinition filter, FindOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual TProjection FindOneAndDelete(FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual TProjection FindOneAndDelete(IClientSessionHandle session, FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task FindOneAndDeleteAsync(FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task FindOneAndDeleteAsync(IClientSessionHandle session, FilterDefinition filter, FindOneAndDeleteOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual TProjection FindOneAndReplace(FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual TProjection FindOneAndReplace(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task FindOneAndReplaceAsync(FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task FindOneAndReplaceAsync(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, FindOneAndReplaceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual TProjection FindOneAndUpdate(FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual TProjection FindOneAndUpdate(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task FindOneAndUpdateAsync(FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task FindOneAndUpdateAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, FindOneAndUpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual void InsertOne(TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { InsertOne(document, options, (requests, bulkWriteOptions) => BulkWrite(requests, bulkWriteOptions, cancellationToken)); } /// public virtual void InsertOne(IClientSessionHandle session, TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { InsertOne(document, options, (requests, bulkWriteOptions) => BulkWrite(session, requests, bulkWriteOptions, cancellationToken)); } private void InsertOne(TDocument document, InsertOneOptions options, Action>, BulkWriteOptions> bulkWrite) { Ensure.IsNotNull((object)document, "document"); var model = new InsertOneModel(document); try { var bulkWriteOptions = options == null ? null : new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; bulkWrite(new[] { model }, bulkWriteOptions); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// [Obsolete("Use the new overload of InsertOneAsync with an InsertOneOptions parameter instead.")] public virtual Task InsertOneAsync(TDocument document, CancellationToken _cancellationToken) { return InsertOneAsync(document, null, _cancellationToken); } /// public virtual Task InsertOneAsync(TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return InsertOneAsync(document, options, (requests, bulkWriteOptions) => BulkWriteAsync(requests, bulkWriteOptions, cancellationToken)); } /// public virtual Task InsertOneAsync(IClientSessionHandle session, TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return InsertOneAsync(document, options, (requests, bulkWriteOptions) => BulkWriteAsync(session, requests, bulkWriteOptions, cancellationToken)); } private async Task InsertOneAsync(TDocument document, InsertOneOptions options, Func>, BulkWriteOptions, Task> bulkWriteAsync) { Ensure.IsNotNull((object)document, "document"); var model = new InsertOneModel(document); try { var bulkWriteOptions = options == null ? null : new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; await bulkWriteAsync(new[] { model }, bulkWriteOptions).ConfigureAwait(false); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual void InsertMany(IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { InsertMany(documents, options, (requests, bulkWriteOptions) => BulkWrite(requests, bulkWriteOptions, cancellationToken)); } /// public virtual void InsertMany(IClientSessionHandle session, IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { InsertMany(documents, options, (requests, bulkWriteOptions) => BulkWrite(session, requests, bulkWriteOptions, cancellationToken)); } private void InsertMany(IEnumerable documents, InsertManyOptions options, Action>, BulkWriteOptions> bulkWrite) { Ensure.IsNotNull(documents, nameof(documents)); var models = documents.Select(x => new InsertOneModel(x)); BulkWriteOptions bulkWriteOptions = options == null ? null : new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation, IsOrdered = options.IsOrdered }; bulkWrite(models, bulkWriteOptions); } /// public virtual Task InsertManyAsync(IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return InsertManyAsync(documents, options, (requests, bulkWriteOptions) => BulkWriteAsync(requests, bulkWriteOptions, cancellationToken)); } /// public virtual Task InsertManyAsync(IClientSessionHandle session, IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return InsertManyAsync(documents, options, (requests, bulkWriteOptions) => BulkWriteAsync(session, requests, bulkWriteOptions, cancellationToken)); } private Task InsertManyAsync(IEnumerable documents, InsertManyOptions options, Func>, BulkWriteOptions, Task> bulkWriteAsync) { Ensure.IsNotNull(documents, nameof(documents)); var models = documents.Select(x => new InsertOneModel(x)); var bulkWriteOptions = options == null ? null : new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation, IsOrdered = options.IsOrdered }; return bulkWriteAsync(models, bulkWriteOptions); } /// public virtual IAsyncCursor MapReduce(BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public virtual IAsyncCursor MapReduce(IClientSessionHandle session, BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task> MapReduceAsync(BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual Task> MapReduceAsync(IClientSessionHandle session, BsonJavaScript map, BsonJavaScript reduce, MapReduceOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract IFilteredMongoCollection OfType() where TDerivedDocument : TDocument; /// public virtual ReplaceOneResult ReplaceOne(FilterDefinition filter, TDocument replacement, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return ReplaceOne(filter, replacement, options, (requests, bulkWriteOptions) => BulkWrite(requests, bulkWriteOptions, cancellationToken)); } /// public virtual ReplaceOneResult ReplaceOne(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return ReplaceOne(filter, replacement, options, (requests, bulkWriteOptions) => BulkWrite(session, requests, bulkWriteOptions, cancellationToken)); } private ReplaceOneResult ReplaceOne(FilterDefinition filter, TDocument replacement, UpdateOptions options, Func>, BulkWriteOptions, BulkWriteResult> bulkWrite) { Ensure.IsNotNull(filter, nameof(filter)); Ensure.IsNotNull((object)replacement, "replacement"); if (options?.ArrayFilters != null) { throw new ArgumentException("ArrayFilters cannot be used with ReplaceOne.", nameof(options)); } options = options ?? new UpdateOptions(); var model = new ReplaceOneModel(filter, replacement) { Collation = options.Collation, IsUpsert = options.IsUpsert }; try { var bulkWriteOptions = new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; var result = bulkWrite(new[] { model }, bulkWriteOptions); return ReplaceOneResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual Task ReplaceOneAsync(FilterDefinition filter, TDocument replacement, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return ReplaceOneAsync(filter, replacement, options, (requests, bulkWriteOptions) => BulkWriteAsync(requests, bulkWriteOptions, cancellationToken)); } /// public virtual Task ReplaceOneAsync(IClientSessionHandle session, FilterDefinition filter, TDocument replacement, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return ReplaceOneAsync(filter, replacement, options, (requests, bulkWriteOptions) => BulkWriteAsync(session, requests, bulkWriteOptions, cancellationToken)); } private async Task ReplaceOneAsync(FilterDefinition filter, TDocument replacement, UpdateOptions options, Func>, BulkWriteOptions, Task>> bulkWriteAsync) { Ensure.IsNotNull(filter, nameof(filter)); Ensure.IsNotNull((object)replacement, "replacement"); if (options?.ArrayFilters != null) { throw new ArgumentException("ArrayFilters cannot be used with ReplaceOne.", nameof(options)); } options = options ?? new UpdateOptions(); var model = new ReplaceOneModel(filter, replacement) { Collation = options.Collation, IsUpsert = options.IsUpsert }; try { var bulkWriteOptions = new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; var result = await bulkWriteAsync(new[] { model }, bulkWriteOptions).ConfigureAwait(false); return ReplaceOneResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual UpdateResult UpdateMany(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateMany(filter, update, options, (requests, bulkWriteOptions) => BulkWrite(requests, bulkWriteOptions, cancellationToken)); } /// public virtual UpdateResult UpdateMany(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateMany(filter, update, options, (requests, bulkWriteOptions) => BulkWrite(session, requests, bulkWriteOptions, cancellationToken)); } private UpdateResult UpdateMany(FilterDefinition filter, UpdateDefinition update, UpdateOptions options, Func>, BulkWriteOptions, BulkWriteResult> bulkWrite) { Ensure.IsNotNull(filter, nameof(filter)); Ensure.IsNotNull(update, nameof(update)); options = options ?? new UpdateOptions(); var model = new UpdateManyModel(filter, update) { ArrayFilters = options.ArrayFilters, Collation = options.Collation, IsUpsert = options.IsUpsert }; try { var bulkWriteOptions = new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; var result = bulkWrite(new[] { model }, bulkWriteOptions); return UpdateResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual Task UpdateManyAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateManyAsync(filter, update, options, (requests, bulkWriteOptions) => BulkWriteAsync(requests, bulkWriteOptions, cancellationToken)); } /// public virtual Task UpdateManyAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateManyAsync(filter, update, options, (requests, bulkWriteOptions) => BulkWriteAsync(session, requests, bulkWriteOptions, cancellationToken)); } private async Task UpdateManyAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options, Func>, BulkWriteOptions, Task>> bulkWriteAsync) { Ensure.IsNotNull(filter, nameof(filter)); Ensure.IsNotNull(update, nameof(update)); options = options ?? new UpdateOptions(); var model = new UpdateManyModel(filter, update) { ArrayFilters = options.ArrayFilters, Collation = options.Collation, IsUpsert = options.IsUpsert }; try { var bulkWriteOptions = new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; var result = await bulkWriteAsync(new[] { model }, bulkWriteOptions).ConfigureAwait(false); return UpdateResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual UpdateResult UpdateOne(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateOne(filter, update, options, (requests, bulkWriteOptions) => BulkWrite(requests, bulkWriteOptions, cancellationToken)); } /// public virtual UpdateResult UpdateOne(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateOne(filter, update, options, (requests, bulkWriteOptions) => BulkWrite(session, requests, bulkWriteOptions, cancellationToken)); } private UpdateResult UpdateOne(FilterDefinition filter, UpdateDefinition update, UpdateOptions options, Func>, BulkWriteOptions, BulkWriteResult> bulkWrite) { Ensure.IsNotNull(filter, nameof(filter)); Ensure.IsNotNull(update, nameof(update)); options = options ?? new UpdateOptions(); var model = new UpdateOneModel(filter, update) { ArrayFilters = options.ArrayFilters, Collation = options.Collation, IsUpsert = options.IsUpsert }; try { var bulkWriteOptions = new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; var result = bulkWrite(new[] { model }, bulkWriteOptions); return UpdateResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual Task UpdateOneAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateOneAsync(filter, update, options, (requests, bulkWriteOptions) => BulkWriteAsync(requests, bulkWriteOptions, cancellationToken)); } /// public virtual Task UpdateOneAsync(IClientSessionHandle session, FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { return UpdateOneAsync(filter, update, options, (requests, bulkWriteOptions) => BulkWriteAsync(session, requests, bulkWriteOptions, cancellationToken)); } private async Task UpdateOneAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options, Func>, BulkWriteOptions, Task>> bulkWriteAsync) { Ensure.IsNotNull(filter, nameof(filter)); Ensure.IsNotNull(update, nameof(update)); options = options ?? new UpdateOptions(); var model = new UpdateOneModel(filter, update) { ArrayFilters = options.ArrayFilters, Collation = options.Collation, IsUpsert = options.IsUpsert }; try { var bulkWriteOptions = new BulkWriteOptions { BypassDocumentValidation = options.BypassDocumentValidation }; var result = await bulkWriteAsync(new[] { model }, bulkWriteOptions).ConfigureAwait(false); return UpdateResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual IAsyncCursor Watch( PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); // implemented by subclasses } /// public virtual IAsyncCursor Watch( IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); // implemented by subclasses } /// public virtual Task> WatchAsync( PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); // implemented by subclasses } /// public virtual Task> WatchAsync( IClientSessionHandle session, PipelineDefinition, TResult> pipeline, ChangeStreamOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); // implemented by subclasses } /// public virtual IMongoCollection WithReadConcern(ReadConcern readConcern) { throw new NotImplementedException(); } /// public abstract IMongoCollection WithReadPreference(ReadPreference readPreference); /// public abstract IMongoCollection WithWriteConcern(WriteConcern writeConcern); } }