using MongoDB.Driver;
using MongoDbGenericRepository.DataAccess.Read;
using MongoDbGenericRepository.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace MongoDbGenericRepository
{
///
/// The base Repository, it is meant to be inherited from by your custom custom MongoRepository implementation.
/// Its constructor must be given a connection string and a database name.
///
public abstract class ReadOnlyMongoRepository : KeyTypedReadOnlyMongoRepository, IReadOnlyMongoRepository
{
///
/// The constructor taking a connection string and a database name.
///
/// The connection string of the MongoDb server.
/// The name of the database against which you want to perform operations.
protected ReadOnlyMongoRepository(string connectionString, string databaseName = null) : base(connectionString, databaseName)
{
}
///
/// The contructor taking a .
///
/// A mongodb context implementing
protected ReadOnlyMongoRepository(IMongoDbContext mongoDbContext) : base(mongoDbContext)
{
}
///
/// The contructor taking a .
///
/// A mongodb context implementing
protected ReadOnlyMongoRepository(IMongoDatabase mongoDatabase) : base(mongoDatabase)
{
}
#region Read TKey
///
/// Asynchronously returns one document given its id.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// The Id of the document you want to get.
/// An optional partition key.
public async virtual Task GetByIdAsync(TKey id, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetByIdAsync(id, partitionKey);
}
///
/// Returns one document given its id.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// The Id of the document you want to get.
/// An optional partition key.
public virtual TDocument GetById(TKey id, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetById(id, partitionKey);
}
///
/// Asynchronously returns one document given an expression filter.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partition key.
public async virtual Task GetOneAsync(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetOneAsync(filter, partitionKey);
}
///
/// Returns one document given an expression filter.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partition key.
public virtual TDocument GetOne(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetOne(filter, partitionKey);
}
///
/// Returns a collection cursor.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partition key.
public virtual IFindFluent GetCursor(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetCursor(filter, partitionKey);
}
///
/// Returns true if any of the document of the collection matches the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partition key.
public async virtual Task AnyAsync(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.AnyAsync(filter, partitionKey);
}
///
/// Returns true if any of the document of the collection matches the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partition key.
public virtual bool Any(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.Any(filter, partitionKey);
}
///
/// Asynchronously returns a list of the documents matching the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partition key.
public async virtual Task> GetAllAsync(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetAllAsync(filter, partitionKey);
}
///
/// Returns a list of the documents matching the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partition key.
public virtual List GetAll(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetAll(filter, partitionKey);
}
///
/// Asynchronously counts how many documents match the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partitionKey
public async virtual Task CountAsync(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.CountAsync(filter, partitionKey);
}
///
/// Counts how many documents match the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// A LINQ expression filter.
/// An optional partitionKey
public virtual long Count(Expression> filter, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.Count(filter, partitionKey);
}
///
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by descending.
/// An optional partitionKey.
public async virtual Task GetByMaxAsync(Expression> filter, Expression> maxValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetByMaxAsync(filter, maxValueSelector, partitionKey);
}
///
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by descending.
/// An optional partitionKey.
public virtual TDocument GetByMax(Expression> filter, Expression> maxValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetByMax(filter, maxValueSelector, partitionKey);
}
///
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
public async virtual Task GetByMinAsync(Expression> filter, Expression> minValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetByMinAsync(filter, minValueSelector, partitionKey);
}
///
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
public virtual TDocument GetByMin(Expression> filter, Expression> minValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetByMin(filter, minValueSelector, partitionKey);
}
///
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
public async virtual Task GetMaxValueAsync(Expression> filter, Expression> maxValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetMaxValueAsync(filter, maxValueSelector, partitionKey);
}
///
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// The type of the value used to order the query.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partitionKey.
public virtual TValue GetMaxValue(Expression> filter, Expression> maxValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetMaxValue(filter, maxValueSelector, partitionKey);
}
///
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// The type of the value used to order the query.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partition key.
public virtual async Task GetMinValueAsync(Expression> filter, Expression> minValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.GetMinValueAsync(filter, minValueSelector, partitionKey);
}
///
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
///
/// The document type.
/// The type of the primary key.
/// The type of the value used to order the query.
/// A LINQ expression filter.
/// A property selector to order by ascending.
/// An optional partition key.
public virtual TValue GetMinValue(Expression> filter, Expression> minValueSelector, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetMinValue(filter, minValueSelector, partitionKey);
}
#endregion
#region Sum TKey
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
public virtual async Task SumByAsync(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.SumByAsync(filter, selector, partitionKey);
}
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
public virtual int SumBy(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.SumBy(filter, selector, partitionKey);
}
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
public virtual async Task SumByAsync(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return await MongoDbReader.SumByAsync(filter, selector, partitionKey);
}
///
/// Sums the values of a selected field for a given filtered collection of documents.
///
/// The type representing a Document.
/// A LINQ expression filter.
/// The field you want to sum.
/// The partition key of your document, if any.
public virtual decimal SumBy(Expression> filter,
Expression> selector,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.SumBy(filter, selector, partitionKey);
}
#endregion Sum TKey
#region Project TKey
///
/// Asynchronously returns a projected document matching the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// The type representing the model you want to project to.
/// A LINQ expression filter.
/// The projection expression.
/// An optional partition key.
public virtual async Task ProjectOneAsync(Expression> filter, Expression> projection, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class
{
return await MongoDbReader.ProjectOneAsync(filter, projection, partitionKey);
}
///
/// Returns a projected document matching the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// The type representing the model you want to project to.
/// A LINQ expression filter.
/// The projection expression.
/// An optional partition key.
public virtual TProjection ProjectOne(Expression> filter, Expression> projection, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class
{
return MongoDbReader.ProjectOne(filter, projection, partitionKey);
}
///
/// Asynchronously returns a list of projected documents matching the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// The type representing the model you want to project to.
/// A LINQ expression filter.
/// The projection expression.
/// An optional partition key.
public virtual async Task> ProjectManyAsync(Expression> filter, Expression> projection, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class
{
return await MongoDbReader.ProjectManyAsync(filter, projection, partitionKey);
}
///
/// Asynchronously returns a list of projected documents matching the filter condition.
///
/// The type representing a Document.
/// The type of the primary key for a Document.
/// The type representing the model you want to project to.
/// The document filter.
/// The projection expression.
/// An optional partition key.
public virtual List ProjectMany(Expression> filter, Expression> projection, string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class
{
return MongoDbReader.ProjectMany(filter, projection, partitionKey);
}
#endregion Project TKey
#region Group By TKey
///
/// Groups filtered a collection of documents given a grouping criteria,
/// and returns a dictionary of listed document groups with keys having the different values of the grouping criteria.
///
/// The type representing a Document.
/// The type of the grouping criteria.
/// The type of the projected group.
/// A LINQ expression filter.
/// The grouping criteria.
/// The projected group result.
/// The partition key of your document, if any.
public virtual List GroupBy(
Expression> groupingCriteria,
Expression, TProjection>> groupProjection,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class, new()
{
return MongoDbReader.GroupBy(groupingCriteria, groupProjection, partitionKey);
}
///
/// Groups filtered a collection of documents given a grouping criteria,
/// and returns a dictionary of listed document groups with keys having the different values of the grouping criteria.
///
/// The type representing a Document.
/// The type of the grouping criteria.
/// The type of the projected group.
/// A LINQ expression filter.
/// The grouping criteria.
/// The projected group result.
/// The partition key of your document, if any.
public virtual List GroupBy(
Expression> filter,
Expression> groupingCriteria,
Expression, TProjection>> groupProjection,
string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
where TProjection : class, new()
{
return MongoDbReader.GroupBy(filter, groupingCriteria, groupProjection, partitionKey);
}
#endregion Group By TKey
///
/// Gets a collections for a potentially partitioned document type.
///
/// The document type.
/// The type of the primary key.
/// The document.
///
public virtual IMongoCollection HandlePartitioned(TDocument document)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.HandlePartitioned(document);
}
///
/// Gets a collections for a potentially partitioned document type.
///
/// The document type.
/// The type of the primary key.
/// The collection partition key.
///
public virtual IMongoCollection HandlePartitioned(string partitionKey)
where TDocument : IDocument
where TKey : IEquatable
{
if (!string.IsNullOrEmpty(partitionKey))
{
return GetCollection(partitionKey);
}
return GetCollection();
}
///
/// Gets a collections for a potentially partitioned document type.
///
/// The document type.
/// The type of the primary key.
/// The document.
///
public virtual IMongoCollection HandlePartitioned(TDocument document)
where TDocument : IDocument
{
return MongoDbReader.HandlePartitioned(document);
}
///
/// Gets a collections for the type TDocument with a partition key.
///
/// The document type.
/// The type of the primary key.
/// The collection partition key.
///
public virtual IMongoCollection GetCollection(string partitionKey = null)
where TDocument : IDocument
where TKey : IEquatable
{
return MongoDbReader.GetCollection(partitionKey);
}
}
}