@@ -73,63 +73,95 @@ protected IMongoCollection<TDocument> WrappedCollection
73
73
}
74
74
75
75
// public methods
76
- public override Task < IAsyncCursor < TResult > > AggregateAsync < TResult > ( PipelineDefinition < TDocument , TResult > pipeline , AggregateOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
76
+ public override IAsyncCursor < TResult > Aggregate < TResult > ( PipelineDefinition < TDocument , TResult > pipeline , AggregateOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
77
77
{
78
- const string matchOperatorName = "$match" ;
79
-
80
- var filterStage = new DelegatedPipelineStageDefinition < TDocument , TDocument > (
81
- matchOperatorName ,
82
- ( s , sr ) =>
83
- {
84
- var renderedFilter = _filter . Render ( s , sr ) ;
85
- return new RenderedPipelineStageDefinition < TDocument > ( matchOperatorName , new BsonDocument ( matchOperatorName , renderedFilter ) , s ) ;
86
- } ) ;
87
-
88
- var filterPipeline = new PipelineStagePipelineDefinition < TDocument , TDocument > ( new [ ] { filterStage } ) ;
89
- var combinedPipeline = new CombinedPipelineDefinition < TDocument , TDocument , TResult > (
90
- filterPipeline ,
91
- pipeline ) ;
78
+ var filteredPipeline = CreateFilteredPipeline ( pipeline ) ;
79
+ return _wrappedCollection . Aggregate ( filteredPipeline , options , cancellationToken ) ;
80
+ }
92
81
93
- var optimizedPipeline = new OptimizingPipelineDefinition < TDocument , TResult > ( combinedPipeline ) ;
82
+ public override Task < IAsyncCursor < TResult > > AggregateAsync < TResult > ( PipelineDefinition < TDocument , TResult > pipeline , AggregateOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
83
+ {
84
+ var filteredPipeline = CreateFilteredPipeline ( pipeline ) ;
85
+ return _wrappedCollection . AggregateAsync ( filteredPipeline , options , cancellationToken ) ;
86
+ }
94
87
95
- return _wrappedCollection . AggregateAsync ( optimizedPipeline , options , cancellationToken ) ;
88
+ public override BulkWriteResult < TDocument > BulkWrite ( IEnumerable < WriteModel < TDocument > > requests , BulkWriteOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
89
+ {
90
+ return _wrappedCollection . BulkWrite ( CombineModelFilters ( requests ) , options , cancellationToken ) ;
96
91
}
97
92
98
93
public override Task < BulkWriteResult < TDocument > > BulkWriteAsync ( IEnumerable < WriteModel < TDocument > > requests , BulkWriteOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
99
94
{
100
95
return _wrappedCollection . BulkWriteAsync ( CombineModelFilters ( requests ) , options , cancellationToken ) ;
101
96
}
102
97
98
+ public override long Count ( FilterDefinition < TDocument > filter , CountOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
99
+ {
100
+ return _wrappedCollection . Count ( CombineFilters ( filter ) , options , cancellationToken ) ;
101
+ }
102
+
103
103
public override Task < long > CountAsync ( FilterDefinition < TDocument > filter , CountOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
104
104
{
105
105
return _wrappedCollection . CountAsync ( CombineFilters ( filter ) , options , cancellationToken ) ;
106
106
}
107
107
108
+ public override IAsyncCursor < TField > Distinct < TField > ( FieldDefinition < TDocument , TField > field , FilterDefinition < TDocument > filter , DistinctOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
109
+ {
110
+ return _wrappedCollection . Distinct ( field , CombineFilters ( filter ) , options , cancellationToken ) ;
111
+ }
112
+
108
113
public override Task < IAsyncCursor < TField > > DistinctAsync < TField > ( FieldDefinition < TDocument , TField > field , FilterDefinition < TDocument > filter , DistinctOptions options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
109
114
{
110
115
return _wrappedCollection . DistinctAsync ( field , CombineFilters ( filter ) , options , cancellationToken ) ;
111
116
}
112
117
118
+ public override IAsyncCursor < TProjection > FindSync < TProjection > ( FilterDefinition < TDocument > filter , FindOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
119
+ {
120
+ return _wrappedCollection . FindSync ( CombineFilters ( filter ) , options , cancellationToken ) ;
121
+ }
122
+
113
123
public override Task < IAsyncCursor < TProjection > > FindAsync < TProjection > ( FilterDefinition < TDocument > filter , FindOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
114
124
{
115
125
return _wrappedCollection . FindAsync ( CombineFilters ( filter ) , options , cancellationToken ) ;
116
126
}
117
127
128
+ public override TProjection FindOneAndDelete < TProjection > ( FilterDefinition < TDocument > filter , FindOneAndDeleteOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
129
+ {
130
+ return _wrappedCollection . FindOneAndDelete ( CombineFilters ( filter ) , options , cancellationToken ) ;
131
+ }
132
+
118
133
public override Task < TProjection > FindOneAndDeleteAsync < TProjection > ( FilterDefinition < TDocument > filter , FindOneAndDeleteOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
119
134
{
120
135
return _wrappedCollection . FindOneAndDeleteAsync ( CombineFilters ( filter ) , options , cancellationToken ) ;
121
136
}
122
137
138
+ public override TProjection FindOneAndReplace < TProjection > ( FilterDefinition < TDocument > filter , TDocument replacement , FindOneAndReplaceOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
139
+ {
140
+ return _wrappedCollection . FindOneAndReplace ( CombineFilters ( filter ) , replacement , options , cancellationToken ) ;
141
+ }
142
+
123
143
public override Task < TProjection > FindOneAndReplaceAsync < TProjection > ( FilterDefinition < TDocument > filter , TDocument replacement , FindOneAndReplaceOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
124
144
{
125
145
return _wrappedCollection . FindOneAndReplaceAsync ( CombineFilters ( filter ) , replacement , options , cancellationToken ) ;
126
146
}
127
147
148
+ public override TProjection FindOneAndUpdate < TProjection > ( FilterDefinition < TDocument > filter , UpdateDefinition < TDocument > update , FindOneAndUpdateOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
149
+ {
150
+ return _wrappedCollection . FindOneAndUpdate ( CombineFilters ( filter ) , update , options , cancellationToken ) ;
151
+ }
152
+
128
153
public override Task < TProjection > FindOneAndUpdateAsync < TProjection > ( FilterDefinition < TDocument > filter , UpdateDefinition < TDocument > update , FindOneAndUpdateOptions < TDocument , TProjection > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
129
154
{
130
155
return _wrappedCollection . FindOneAndUpdateAsync ( CombineFilters ( filter ) , update , options , cancellationToken ) ;
131
156
}
132
157
158
+ public override IAsyncCursor < TResult > MapReduce < TResult > ( BsonJavaScript map , BsonJavaScript reduce , MapReduceOptions < TDocument , TResult > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
159
+ {
160
+ options = options ?? new MapReduceOptions < TDocument , TResult > ( ) ;
161
+ options . Filter = CombineFilters ( options . Filter ) ;
162
+ return _wrappedCollection . MapReduce ( map , reduce , options , cancellationToken ) ;
163
+ }
164
+
133
165
public override Task < IAsyncCursor < TResult > > MapReduceAsync < TResult > ( BsonJavaScript map , BsonJavaScript reduce , MapReduceOptions < TDocument , TResult > options = null , CancellationToken cancellationToken = default ( CancellationToken ) )
134
166
{
135
167
options = options ?? new MapReduceOptions < TDocument , TResult > ( ) ;
@@ -181,5 +213,25 @@ private IEnumerable<WriteModel<TDocument>> CombineModelFilters(IEnumerable<Write
181
213
}
182
214
} ) ;
183
215
}
216
+
217
+ private PipelineDefinition < TDocument , TResult > CreateFilteredPipeline < TResult > ( PipelineDefinition < TDocument , TResult > pipeline )
218
+ {
219
+ const string matchOperatorName = "$match" ;
220
+
221
+ var filterStage = new DelegatedPipelineStageDefinition < TDocument , TDocument > (
222
+ matchOperatorName ,
223
+ ( s , sr ) =>
224
+ {
225
+ var renderedFilter = _filter . Render ( s , sr ) ;
226
+ return new RenderedPipelineStageDefinition < TDocument > ( matchOperatorName , new BsonDocument ( matchOperatorName , renderedFilter ) , s ) ;
227
+ } ) ;
228
+
229
+ var filterPipeline = new PipelineStagePipelineDefinition < TDocument , TDocument > ( new [ ] { filterStage } ) ;
230
+ var combinedPipeline = new CombinedPipelineDefinition < TDocument , TDocument , TResult > (
231
+ filterPipeline ,
232
+ pipeline ) ;
233
+
234
+ return new OptimizingPipelineDefinition < TDocument , TResult > ( combinedPipeline ) ;
235
+ }
184
236
}
185
237
}
0 commit comments