private PipelineDefinition <TDocument, TResult> CreateFilteredPipeline <TResult>(PipelineDefinition <TDocument, TResult> pipeline) { const string matchOperatorName = "$match"; var filterStage = new DelegatedPipelineStageDefinition <TDocument, TDocument>( matchOperatorName, (s, sr) => { var renderedFilter = _filter.Render(s, sr); return(new RenderedPipelineStageDefinition <TDocument>(matchOperatorName, new BsonDocument(matchOperatorName, renderedFilter), s)); }); var filterPipeline = new PipelineStagePipelineDefinition <TDocument, TDocument>(new[] { filterStage }); var combinedPipeline = new CombinedPipelineDefinition <TDocument, TDocument, TResult>( filterPipeline, pipeline); return(new OptimizingPipelineDefinition <TDocument, TResult>(combinedPipeline)); }
// public methods public override Task <IAsyncCursor <TResult> > AggregateAsync <TResult>(PipelineDefinition <TDocument, TResult> pipeline, AggregateOptions options = null, CancellationToken cancellationToken = default(CancellationToken)) { const string matchOperatorName = "$match"; var filterStage = new DelegatedPipelineStageDefinition <TDocument, TDocument>( matchOperatorName, (s, sr) => { var renderedFilter = _filter.Render(s, sr); return(new RenderedPipelineStageDefinition <TDocument>(matchOperatorName, new BsonDocument(matchOperatorName, renderedFilter), s)); }); var filterPipeline = new PipelineStagePipelineDefinition <TDocument, TDocument>(new[] { filterStage }); var combinedPipeline = new CombinedPipelineDefinition <TDocument, TDocument, TResult>( filterPipeline, pipeline); var optimizedPipeline = new OptimizingPipelineDefinition <TDocument, TResult>(combinedPipeline); return(_wrappedCollection.AggregateAsync(optimizedPipeline, options, cancellationToken)); }