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));
        }
Beispiel #2
0
        // 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));
        }