/* 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);
}
}