/* 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