From e15cb60ee00f1fbf63b3e6a69ae3a362ceb12f37 Mon Sep 17 00:00:00 2001 From: hector7 Date: Tue, 2 Oct 2018 06:12:14 +0200 Subject: [PATCH] [mongodb] Checked TSchema on insert and update documents (#29245) * Schema definition on insertOne, insertMany and update definitions. Added types as OptionalTSchema and UpdateQuery. * added user on definitions by * added missing properties and url docs * added missing properties and url docs with test * added missing properties and url docs with test * changed OptionalTSchema to Partial, modified logic on update funcs, this will be more strict --- types/mongodb/index.d.ts | 86 ++++++++++++++++++++-------------- types/mongodb/mongodb-tests.ts | 6 ++- 2 files changed, 54 insertions(+), 38 deletions(-) diff --git a/types/mongodb/index.d.ts b/types/mongodb/index.d.ts index aac9a22a9a..03ff37a76d 100644 --- a/types/mongodb/index.d.ts +++ b/types/mongodb/index.d.ts @@ -17,6 +17,7 @@ // Dominik Heigl // Angela-1 // Mikael Lirbank +// Hector Ribes // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 2.3 @@ -642,14 +643,14 @@ export interface Collection { * @deprecated Use countDocuments or estimatedDocumentCount */ count(callback: MongoCallback): void; - count(query: Object, callback: MongoCallback): void; - count(query?: Object, options?: MongoCountPreferences): Promise; - count(query: Object, options: MongoCountPreferences, callback: MongoCallback): void; + count(query: FilterQuery, callback: MongoCallback): void; + count(query?: FilterQuery, options?: MongoCountPreferences): Promise; + count(query: FilterQuery, options: MongoCountPreferences, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#countDocuments */ countDocuments(callback: MongoCallback): void; - countDocuments(query: Object, callback: MongoCallback): void; - countDocuments(query?: Object, options?: MongoCountPreferences): Promise; - countDocuments(query: Object, options: MongoCountPreferences, callback: MongoCallback): void; + countDocuments(query: FilterQuery, callback: MongoCallback): void; + countDocuments(query?: FilterQuery, options?: MongoCountPreferences): Promise; + countDocuments(query: FilterQuery, options: MongoCountPreferences, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#createIndex */ createIndex(fieldOrSpec: string | any, callback: MongoCallback): void; createIndex(fieldOrSpec: string | any, options?: IndexOptions): Promise; @@ -667,9 +668,9 @@ export interface Collection { deleteOne(filter: FilterQuery, options?: CommonOptions & { bypassDocumentValidation?: boolean }): Promise; deleteOne(filter: FilterQuery, options: CommonOptions & { bypassDocumentValidation?: boolean }, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#distinct */ - distinct(key: string, query: Object, callback: MongoCallback): void; - distinct(key: string, query: Object, options?: { readPreference?: ReadPreference | string, maxTimeMS?: number, session?: ClientSession }): Promise; - distinct(key: string, query: Object, options: { readPreference?: ReadPreference | string, maxTimeMS?: number, session?: ClientSession }, callback: MongoCallback): void; + distinct(key: string, query: FilterQuery, callback: MongoCallback): void; + distinct(key: string, query: FilterQuery, options?: { readPreference?: ReadPreference | string, maxTimeMS?: number, session?: ClientSession }): Promise; + distinct(key: string, query: FilterQuery, options: { readPreference?: ReadPreference | string, maxTimeMS?: number, session?: ClientSession }, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#drop */ drop(options?: { session: ClientSession }): Promise; drop(callback: MongoCallback): void; @@ -684,9 +685,9 @@ export interface Collection { dropIndexes(options: { session?: ClientSession, maxTimeMS?: number }, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#estimatedDocumentCount */ estimatedDocumentCount(callback: MongoCallback): void; - estimatedDocumentCount(query: Object, callback: MongoCallback): void; - estimatedDocumentCount(query?: Object, options?: MongoCountPreferences): Promise; - estimatedDocumentCount(query: Object, options: MongoCountPreferences, callback: MongoCallback): void; + estimatedDocumentCount(query: FilterQuery, callback: MongoCallback): void; + estimatedDocumentCount(query?: FilterQuery, options?: MongoCountPreferences): Promise; + estimatedDocumentCount(query: FilterQuery, options: MongoCountPreferences, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#find */ find(query?: FilterQuery): Cursor; /** @deprecated */ @@ -737,19 +738,19 @@ export interface Collection { initializeUnorderedBulkOp(options?: CommonOptions): UnorderedBulkOperation; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#insertOne */ /** @deprecated Use insertOne, insertMany or bulkWrite */ - insert(docs: Object, callback: MongoCallback): void; + insert(docs: TSchema, callback: MongoCallback): void; /** @deprecated Use insertOne, insertMany or bulkWrite */ - insert(docs: Object, options?: CollectionInsertOneOptions): Promise; + insert(docs: TSchema, options?: CollectionInsertOneOptions): Promise; /** @deprecated Use insertOne, insertMany or bulkWrite */ - insert(docs: Object, options: CollectionInsertOneOptions, callback: MongoCallback): void; + insert(docs: TSchema, options: CollectionInsertOneOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#insertMany */ - insertMany(docs: Object[], callback: MongoCallback): void; - insertMany(docs: Object[], options?: CollectionInsertManyOptions): Promise; - insertMany(docs: Object[], options: CollectionInsertManyOptions, callback: MongoCallback): void; + insertMany(docs: TSchema[], callback: MongoCallback): void; + insertMany(docs: TSchema[], options?: CollectionInsertManyOptions): Promise; + insertMany(docs: TSchema[], options: CollectionInsertManyOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#insertOne */ - insertOne(docs: Object, callback: MongoCallback): void; - insertOne(docs: Object, options?: CollectionInsertOneOptions): Promise; - insertOne(docs: Object, options: CollectionInsertOneOptions, callback: MongoCallback): void; + insertOne(docs: TSchema, callback: MongoCallback): void; + insertOne(docs: TSchema, options?: CollectionInsertOneOptions): Promise; + insertOne(docs: TSchema, options: CollectionInsertOneOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#isCapped */ isCapped(options?: { session: ClientSession }): Promise; isCapped(callback: MongoCallback): void; @@ -784,39 +785,52 @@ export interface Collection { rename(newName: string, options?: { dropTarget?: boolean, session?: ClientSession }): Promise>; rename(newName: string, options: { dropTarget?: boolean, session?: ClientSession }, callback: MongoCallback>): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#replaceOne */ - replaceOne(filter: FilterQuery, doc: Object, callback: MongoCallback): void; - replaceOne(filter: FilterQuery, doc: Object, options?: ReplaceOneOptions): Promise; - replaceOne(filter: FilterQuery, doc: Object, options: ReplaceOneOptions, callback: MongoCallback): void; + replaceOne(filter: FilterQuery, doc: TSchema, callback: MongoCallback): void; + replaceOne(filter: FilterQuery, doc: TSchema, options?: ReplaceOneOptions): Promise; + replaceOne(filter: FilterQuery, doc: TSchema, options: ReplaceOneOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#save */ /** @deprecated Use insertOne, insertMany, updateOne or updateMany */ - save(doc: Object, callback: MongoCallback): void; + save(doc: TSchema, callback: MongoCallback): void; /** @deprecated Use insertOne, insertMany, updateOne or updateMany */ - save(doc: Object, options?: CommonOptions): Promise; + save(doc: TSchema, options?: CommonOptions): Promise; /** @deprecated Use insertOne, insertMany, updateOne or updateMany */ - save(doc: Object, options: CommonOptions, callback: MongoCallback): void; + save(doc: TSchema, options: CommonOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#stats */ stats(callback: MongoCallback): void; stats(options?: { scale: number, session?: ClientSession }): Promise; stats(options: { scale: number, session?: ClientSession }, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#update */ /** @deprecated use updateOne, updateMany or bulkWrite */ - update(filter: FilterQuery, update: Object, callback: MongoCallback): void; + update(filter: FilterQuery, update: UpdateQuery | TSchema, callback: MongoCallback): void; /** @deprecated use updateOne, updateMany or bulkWrite */ - update(filter: FilterQuery, update: Object, options?: ReplaceOneOptions & { multi?: boolean }): Promise; + update(filter: FilterQuery, update: UpdateQuery | TSchema, options?: ReplaceOneOptions & { multi?: boolean }): Promise; /** @deprecated use updateOne, updateMany or bulkWrite */ - update(filter: FilterQuery, update: Object, options: ReplaceOneOptions & { multi?: boolean }, callback: MongoCallback): void; + update(filter: FilterQuery, update: UpdateQuery | TSchema, options: ReplaceOneOptions & { multi?: boolean }, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#updateMany */ - updateMany(filter: FilterQuery, update: Object, callback: MongoCallback): void; - updateMany(filter: FilterQuery, update: Object, options?: CommonOptions & { upsert?: boolean }): Promise; - updateMany(filter: FilterQuery, update: Object, options: CommonOptions & { upsert?: boolean }, callback: MongoCallback): void; + updateMany(filter: FilterQuery, update: UpdateQuery | TSchema, callback: MongoCallback): void; + updateMany(filter: FilterQuery, update: UpdateQuery | TSchema, options?: CommonOptions & { upsert?: boolean }): Promise; + updateMany(filter: FilterQuery, update: UpdateQuery | TSchema, options: CommonOptions & { upsert?: boolean }, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#updateOne */ - updateOne(filter: FilterQuery, update: Object, callback: MongoCallback): void; - updateOne(filter: FilterQuery, update: Object, options?: ReplaceOneOptions): Promise; - updateOne(filter: FilterQuery, update: Object, options: ReplaceOneOptions, callback: MongoCallback): void; + updateOne(filter: FilterQuery, update: UpdateQuery | TSchema, callback: MongoCallback): void; + updateOne(filter: FilterQuery, update: UpdateQuery | TSchema, options?: ReplaceOneOptions): Promise; + updateOne(filter: FilterQuery, update: UpdateQuery | TSchema, options: ReplaceOneOptions, callback: MongoCallback): void; /** http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#watch */ watch(pipeline?: Object[], options?: ChangeStreamOptions & { startAtClusterTime?: Timestamp, session?: ClientSession }): ChangeStream; } +/** https://docs.mongodb.com/manual/reference/operator/update */ +export type UpdateQuery = { + $inc: { [P in keyof T]?: number } | { [key: string]: number }, + $min: { [P in keyof T]?: number } | { [key: string]: number }, + $max: { [P in keyof T]?: number } | { [key: string]: number }, + $mul: { [P in keyof T]?: number } | { [key: string]: number }, + $set: Partial | { [key: string]: any }, + $setOnInsert: Partial | { [key: string]: any }, + $unset: { [P in keyof T]?: '' } | { [key: string]: '' }, + $rename: { [key: string]: keyof T } | { [key: string]: string }, + $currentDate: { [P in keyof T]?: (true | { $type: 'timestamp' }) } | { [key: string]: (true | { $type: 'timestamp' }) }, +}; + export type FilterQuery = { [P in keyof T]?: T[P] | { $eq?: T[P]; diff --git a/types/mongodb/mongodb-tests.ts b/types/mongodb/mongodb-tests.ts index 9151346ea5..b9b4a63c8d 100644 --- a/types/mongodb/mongodb-tests.ts +++ b/types/mongodb/mongodb-tests.ts @@ -36,6 +36,7 @@ let options: mongodb.MongoClientOptions = { MongoClient.connect(connectionString, options, function (err: mongodb.MongoError, client: mongodb.MongoClient) { if (err) throw err; const db = client.db('test'); + var collection = db.collection('test_insert'); collection.insertOne({ a: 2 }, function (err: mongodb.MongoError, docs: any) { @@ -156,10 +157,11 @@ MongoClient.connect(connectionString, options, function (err: mongodb.MongoError { type TestCollection = { stringField: string; - numberField: number; + numberField?: number; }; let testCollection = db.collection('testCollection'); - + testCollection.insertOne({stringField:'hola'}) + testCollection.insertMany([{stringField:'hola'},{stringField:'hola', numberField: 1}]) testCollection.find({ numberField: { $and: [{ $gt: 0, $lt: 100 }]