/* Copyright 2010-2017 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 abstract Task> AggregateAsync(PipelineDefinition pipeline, AggregateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual BulkWriteResult BulkWrite(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 long Count(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } /// public abstract Task CountAsync(FilterDefinition filter, CountOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// 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)) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteManyModel(filter) { Collation = options.Collation }; try { var result = BulkWrite(new[] { model }, null, cancellationToken); 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 async Task DeleteManyAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default(CancellationToken)) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteManyModel(filter) { Collation = options.Collation }; try { var result = await BulkWriteAsync(new[] { model }, null, cancellationToken).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)) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteOneModel(filter) { Collation = options.Collation }; try { var result = BulkWrite(new[] { model }, null, cancellationToken); 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 async Task DeleteOneAsync(FilterDefinition filter, DeleteOptions options, CancellationToken cancellationToken = default(CancellationToken)) { Ensure.IsNotNull(filter, nameof(filter)); options = options ?? new DeleteOptions(); var model = new DeleteOneModel(filter) { Collation = options.Collation }; try { var result = await BulkWriteAsync(new[] { model }, null, cancellationToken).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 abstract Task> DistinctAsync(FieldDefinition field, FilterDefinition filter, DistinctOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); /// public virtual IAsyncCursor FindSync(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 TProjection FindOneAndDelete(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 TProjection FindOneAndReplace(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 TProjection FindOneAndUpdate(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 void InsertOne(TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken); } 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 async Task InsertOneAsync(TDocument document, InsertOneOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken).ConfigureAwait(false); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual void InsertMany(IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken); } /// public virtual Task InsertManyAsync(IEnumerable documents, InsertManyOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken); } /// public virtual IAsyncCursor MapReduce(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 abstract IFilteredMongoCollection OfType() where TDerivedDocument : TDocument; /// public virtual ReplaceOneResult ReplaceOne(FilterDefinition filter, TDocument replacement, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken); return ReplaceOneResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual async Task ReplaceOneAsync(FilterDefinition filter, TDocument replacement, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken).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)) { 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, cancellationToken); return UpdateResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual async Task UpdateManyAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken).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)) { 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, cancellationToken); return UpdateResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual async Task UpdateOneAsync(FilterDefinition filter, UpdateDefinition update, UpdateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { 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, cancellationToken).ConfigureAwait(false); return UpdateResult.FromCore(result); } catch (MongoBulkWriteException ex) { throw MongoWriteException.FromBulkWriteException(ex); } } /// public virtual IMongoCollection WithReadConcern(ReadConcern readConcern) { throw new NotImplementedException(); } /// public abstract IMongoCollection WithReadPreference(ReadPreference readPreference); /// public abstract IMongoCollection WithWriteConcern(WriteConcern writeConcern); } }