@@ -2247,6 +2247,68 @@ func (c *Collection) FindId(id interface{}) *Query {
2247
2247
return c .Find (bson.D {{"_id" , id }})
2248
2248
}
2249
2249
2250
+ type ChangeStream struct {
2251
+ iter * Iter
2252
+ options ChangeStreamOptions
2253
+ pipeline interface {}
2254
+ readPreference * ReadPreference
2255
+ }
2256
+
2257
+ type ChangeStreamOptions struct {
2258
+
2259
+ // FullDocument controls the amount of data that the server will return when
2260
+ // returning a changes document.
2261
+ FullDocument string
2262
+
2263
+ // ResumeAfter specifies the logical starting point for the new change stream.
2264
+ ResumeAfter * bson.Raw
2265
+
2266
+ // MaxAwaitTimeMS specifies the maximum amount of time for the server to wait
2267
+ // on new documents to satisfy a change stream query.
2268
+ MaxAwaitTimeMS int64
2269
+
2270
+ // BatchSize specifies the number of documents to return per batch.
2271
+ BatchSize int32
2272
+
2273
+ // Collation specifies the way the server should collate returned data.
2274
+ Collation * Collation
2275
+ }
2276
+
2277
+ func constructChangeStreamPipeline (pipeline interface {},
2278
+ options ChangeStreamOptions ) interface {} {
2279
+ pipelinev := reflect .ValueOf (pipeline )
2280
+
2281
+ // ensure that the pipeline passed in is a slice.
2282
+ if pipelinev .Kind () != reflect .Slice {
2283
+ panic ("pipeline argument must be a slice" )
2284
+ }
2285
+
2286
+ // construct the options to be used by the change notification
2287
+ // pipeline stage.
2288
+ changeNotificationStageOptions := bson.M {}
2289
+
2290
+ if options .FullDocument != "" {
2291
+ changeNotificationStageOptions ["fullDocument" ] = options .FullDocument
2292
+ }
2293
+ if options .ResumeAfter != nil {
2294
+ changeNotificationStageOptions ["resumeAfter" ] = options .ResumeAfter
2295
+ }
2296
+ changeNotificationStage := bson.M {"$changeNotification" : changeNotificationStageOptions }
2297
+
2298
+ pipeOfInterfaces := make ([]interface {}, pipelinev .Len ()+ 1 )
2299
+
2300
+ // insert the change notification pipeline stage at the beginning of the
2301
+ // aggregation.
2302
+ pipeOfInterfaces [0 ] = changeNotificationStage
2303
+
2304
+ // convert the passed in slice to a slice of interfaces.
2305
+ for i := 0 ; i < pipelinev .Len (); i ++ {
2306
+ pipeOfInterfaces [1 + i ] = pipelinev .Index (i ).Addr ().Interface ()
2307
+ }
2308
+ var pipelineAsInterface interface {} = pipeOfInterfaces
2309
+ return pipelineAsInterface
2310
+ }
2311
+
2250
2312
type Pipe struct {
2251
2313
session * Session
2252
2314
collection * Collection
0 commit comments