From a36041a69ef76a085003847670a61e0b883bc1ce Mon Sep 17 00:00:00 2001 From: Lenart Bezek Date: Tue, 9 Apr 2019 14:54:37 +0200 Subject: [PATCH 1/3] [@types/mongodb] Fix CollectionReduceFunction signature Collection reduce function does not necessarily take string as the key argument, but it does take an array of values that should be reduced into a single value. I made the `mapReduce` method generic for types to be inferred from use or provided explicitly. --- types/mongodb/index.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/types/mongodb/index.d.ts b/types/mongodb/index.d.ts index 230f593094..cdab294fbe 100644 --- a/types/mongodb/index.d.ts +++ b/types/mongodb/index.d.ts @@ -955,9 +955,9 @@ export interface Collection { /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#listIndexes */ listIndexes(options?: { batchSize?: number, readPreference?: ReadPreference | string, session?: ClientSession }): CommandCursor; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#mapReduce */ - mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, callback: MongoCallback): void; - mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options?: MapReduceOptions): Promise; - mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options: MapReduceOptions, callback: MongoCallback): void; + mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, callback: MongoCallback): void; + mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options?: MapReduceOptions): Promise; + mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options: MapReduceOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#options */ options(options?: { session: ClientSession }): Promise; options(callback: MongoCallback): void; @@ -1665,7 +1665,7 @@ export interface MapReduceOptions { export type CollectionMapFunction = () => void; -export type CollectionReduceFunction = (key: string, values: any) => any; +export type CollectionReduceFunction = (key: TKey, values: TValue[]) => TValue; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#~WriteOpResult */ export interface WriteOpResult { From 3904c5d4882e077ed1cb6971134a3b91403735f2 Mon Sep 17 00:00:00 2001 From: Lenart Bezek Date: Tue, 9 Apr 2019 15:55:07 +0200 Subject: [PATCH 2/3] Bind this in CollectionMapFunction. --- types/mongodb/index.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/types/mongodb/index.d.ts b/types/mongodb/index.d.ts index cdab294fbe..5111e4d9ca 100644 --- a/types/mongodb/index.d.ts +++ b/types/mongodb/index.d.ts @@ -955,9 +955,9 @@ export interface Collection { /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#listIndexes */ listIndexes(options?: { batchSize?: number, readPreference?: ReadPreference | string, session?: ClientSession }): CommandCursor; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#mapReduce */ - mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, callback: MongoCallback): void; - mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options?: MapReduceOptions): Promise; - mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options: MapReduceOptions, callback: MongoCallback): void; + mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, callback: MongoCallback): void; + mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options?: MapReduceOptions): Promise; + mapReduce(map: CollectionMapFunction | string, reduce: CollectionReduceFunction | string, options: MapReduceOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#options */ options(options?: { session: ClientSession }): Promise; options(callback: MongoCallback): void; @@ -1663,7 +1663,7 @@ export interface MapReduceOptions { session?: ClientSession; } -export type CollectionMapFunction = () => void; +export type CollectionMapFunction = (this: TSchema) => void; export type CollectionReduceFunction = (key: TKey, values: TValue[]) => TValue; From fcedb2754c99c3241c3aa21501c6d4d1f9c3d4f3 Mon Sep 17 00:00:00 2001 From: Lenart Bezek Date: Thu, 11 Apr 2019 10:30:34 +0200 Subject: [PATCH 3/3] Add mapReduce test. --- types/mongodb/mongodb-tests.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/types/mongodb/mongodb-tests.ts b/types/mongodb/mongodb-tests.ts index d8eb287964..f34e2e5c29 100644 --- a/types/mongodb/mongodb-tests.ts +++ b/types/mongodb/mongodb-tests.ts @@ -317,3 +317,29 @@ mongodb.connect(connectionString).then((client) => { runTransactionWithRetry(updateEmployeeInfo, client, session) ); }); + +// https://docs.mongodb.com/manual/core/map-reduce/ + +// Declare emit function to be called inside map function +declare function emit(key: any, value: any): void; + +interface ITestMapReduceSchema { + cust_id: string; + amount: number; + status: string; +} + +function testCollectionMapFunction(this: ITestMapReduceSchema) { + emit(this.cust_id, this.amount); +} + +function testCollectionReduceFunction(_key: string, values: number[]): number { + return values.reduce((a, v) => a + v, 0); +} + +mongodb.connect(connectionString).then((client) => { + client.db("test").collection('test-mapReduce-collection').mapReduce( + testCollectionMapFunction, + testCollectionReduceFunction + ); +});