123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- const mongodb = require('mongodb');
- const Collection = mongodb.Collection;
- class MongoCollection {
- constructor(mongoCollection) {
- this._mongoCollection = mongoCollection;
- }
- // Does a find with "smart indexing".
- // Currently this just means, if it needs a geoindex and there is
- // none, then build the geoindex.
- // This could be improved a lot but it's not clear if that's a good
- // idea. Or even if this behavior is a good idea.
- find(query, {
- skip,
- limit,
- sort,
- keys,
- maxTimeMS,
- readPreference,
- hint,
- caseInsensitive,
- explain,
- comment
- } = {}) {
- // Support for Full Text Search - $text
- if (keys && keys.$score) {
- delete keys.$score;
- keys.score = {
- $meta: 'textScore'
- };
- }
- return this._rawFind(query, {
- skip,
- limit,
- sort,
- keys,
- maxTimeMS,
- readPreference,
- hint,
- caseInsensitive,
- explain,
- comment
- }).catch(error => {
- // Check for "no geoindex" error
- if (error.code != 17007 && !error.message.match(/unable to find index for .geoNear/)) {
- throw error;
- }
- // Figure out what key needs an index
- const key = error.message.match(/field=([A-Za-z_0-9]+) /)[1];
- if (!key) {
- throw error;
- }
- var index = {};
- index[key] = '2d';
- return this._mongoCollection.createIndex(index)
- // Retry, but just once.
- .then(() => this._rawFind(query, {
- skip,
- limit,
- sort,
- keys,
- maxTimeMS,
- readPreference,
- hint,
- caseInsensitive,
- explain,
- comment
- }));
- });
- }
- /**
- * Collation to support case insensitive queries
- */
- static caseInsensitiveCollation() {
- return {
- locale: 'en_US',
- strength: 2
- };
- }
- _rawFind(query, {
- skip,
- limit,
- sort,
- keys,
- maxTimeMS,
- readPreference,
- hint,
- caseInsensitive,
- explain,
- comment
- } = {}) {
- let findOperation = this._mongoCollection.find(query, {
- skip,
- limit,
- sort,
- readPreference,
- hint,
- comment
- });
- if (keys) {
- findOperation = findOperation.project(keys);
- }
- if (caseInsensitive) {
- findOperation = findOperation.collation(MongoCollection.caseInsensitiveCollation());
- }
- if (maxTimeMS) {
- findOperation = findOperation.maxTimeMS(maxTimeMS);
- }
- return explain ? findOperation.explain(explain) : findOperation.toArray();
- }
- count(query, {
- skip,
- limit,
- sort,
- maxTimeMS,
- readPreference,
- hint,
- comment
- } = {}) {
- // If query is empty, then use estimatedDocumentCount instead.
- // This is due to countDocuments performing a scan,
- // which greatly increases execution time when being run on large collections.
- // See https://github.com/Automattic/mongoose/issues/6713 for more info regarding this problem.
- if (typeof query !== 'object' || !Object.keys(query).length) {
- return this._mongoCollection.estimatedDocumentCount({
- maxTimeMS
- });
- }
- const countOperation = this._mongoCollection.countDocuments(query, {
- skip,
- limit,
- sort,
- maxTimeMS,
- readPreference,
- hint,
- comment
- });
- return countOperation;
- }
- distinct(field, query) {
- return this._mongoCollection.distinct(field, query);
- }
- aggregate(pipeline, {
- maxTimeMS,
- readPreference,
- hint,
- explain,
- comment
- } = {}) {
- return this._mongoCollection.aggregate(pipeline, {
- maxTimeMS,
- readPreference,
- hint,
- explain,
- comment
- }).toArray();
- }
- insertOne(object, session) {
- return this._mongoCollection.insertOne(object, {
- session
- });
- }
- // Atomically updates data in the database for a single (first) object that matched the query
- // If there is nothing that matches the query - does insert
- // Postgres Note: `INSERT ... ON CONFLICT UPDATE` that is available since 9.5.
- upsertOne(query, update, session) {
- return this._mongoCollection.updateOne(query, update, {
- upsert: true,
- session
- });
- }
- updateOne(query, update) {
- return this._mongoCollection.updateOne(query, update);
- }
- updateMany(query, update, session) {
- return this._mongoCollection.updateMany(query, update, {
- session
- });
- }
- deleteMany(query, session) {
- return this._mongoCollection.deleteMany(query, {
- session
- });
- }
- _ensureSparseUniqueIndexInBackground(indexRequest) {
- return this._mongoCollection.createIndex(indexRequest, {
- unique: true,
- background: true,
- sparse: true
- });
- }
- drop() {
- return this._mongoCollection.drop();
- }
- }
- exports.default = MongoCollection;
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb25nb2RiIiwicmVxdWlyZSIsIkNvbGxlY3Rpb24iLCJNb25nb0NvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm1vbmdvQ29sbGVjdGlvbiIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kIiwicXVlcnkiLCJza2lwIiwibGltaXQiLCJzb3J0Iiwia2V5cyIsIm1heFRpbWVNUyIsInJlYWRQcmVmZXJlbmNlIiwiaGludCIsImNhc2VJbnNlbnNpdGl2ZSIsImV4cGxhaW4iLCJjb21tZW50IiwiJHNjb3JlIiwic2NvcmUiLCIkbWV0YSIsIl9yYXdGaW5kIiwiY2F0Y2giLCJlcnJvciIsImNvZGUiLCJtZXNzYWdlIiwibWF0Y2giLCJrZXkiLCJpbmRleCIsImNyZWF0ZUluZGV4IiwidGhlbiIsImNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbiIsImxvY2FsZSIsInN0cmVuZ3RoIiwiZmluZE9wZXJhdGlvbiIsInByb2plY3QiLCJjb2xsYXRpb24iLCJ0b0FycmF5IiwiY291bnQiLCJPYmplY3QiLCJsZW5ndGgiLCJlc3RpbWF0ZWREb2N1bWVudENvdW50IiwiY291bnRPcGVyYXRpb24iLCJjb3VudERvY3VtZW50cyIsImRpc3RpbmN0IiwiZmllbGQiLCJhZ2dyZWdhdGUiLCJwaXBlbGluZSIsImluc2VydE9uZSIsIm9iamVjdCIsInNlc3Npb24iLCJ1cHNlcnRPbmUiLCJ1cGRhdGUiLCJ1cGRhdGVPbmUiLCJ1cHNlcnQiLCJ1cGRhdGVNYW55IiwiZGVsZXRlTWFueSIsIl9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZCIsImluZGV4UmVxdWVzdCIsInVuaXF1ZSIsImJhY2tncm91bmQiLCJzcGFyc2UiLCJkcm9wIiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb0NvbGxlY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbW9uZ29kYiA9IHJlcXVpcmUoJ21vbmdvZGInKTtcbmNvbnN0IENvbGxlY3Rpb24gPSBtb25nb2RiLkNvbGxlY3Rpb247XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vbmdvQ29sbGVjdGlvbiB7XG4gIF9tb25nb0NvbGxlY3Rpb246IENvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IobW9uZ29Db2xsZWN0aW9uOiBDb2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uID0gbW9uZ29Db2xsZWN0aW9uO1xuICB9XG5cbiAgLy8gRG9lcyBhIGZpbmQgd2l0aCBcInNtYXJ0IGluZGV4aW5nXCIuXG4gIC8vIEN1cnJlbnRseSB0aGlzIGp1c3QgbWVhbnMsIGlmIGl0IG5lZWRzIGEgZ2VvaW5kZXggYW5kIHRoZXJlIGlzXG4gIC8vIG5vbmUsIHRoZW4gYnVpbGQgdGhlIGdlb2luZGV4LlxuICAvLyBUaGlzIGNvdWxkIGJlIGltcHJvdmVkIGEgbG90IGJ1dCBpdCdzIG5vdCBjbGVhciBpZiB0aGF0J3MgYSBnb29kXG4gIC8vIGlkZWEuIE9yIGV2ZW4gaWYgdGhpcyBiZWhhdmlvciBpcyBhIGdvb2QgaWRlYS5cbiAgZmluZChcbiAgICBxdWVyeSxcbiAgICB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0gPSB7fVxuICApIHtcbiAgICAvLyBTdXBwb3J0IGZvciBGdWxsIFRleHQgU2VhcmNoIC0gJHRleHRcbiAgICBpZiAoa2V5cyAmJiBrZXlzLiRzY29yZSkge1xuICAgICAgZGVsZXRlIGtleXMuJHNjb3JlO1xuICAgICAga2V5cy5zY29yZSA9IHsgJG1ldGE6ICd0ZXh0U2NvcmUnIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIG1heFRpbWVNUyxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciBcIm5vIGdlb2luZGV4XCIgZXJyb3JcbiAgICAgIGlmIChlcnJvci5jb2RlICE9IDE3MDA3ICYmICFlcnJvci5tZXNzYWdlLm1hdGNoKC91bmFibGUgdG8gZmluZCBpbmRleCBmb3IgLmdlb05lYXIvKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBrZXkgbmVlZHMgYW4gaW5kZXhcbiAgICAgIGNvbnN0IGtleSA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL2ZpZWxkPShbQS1aYS16XzAtOV0rKSAvKVsxXTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGluZGV4W2tleV0gPSAnMmQnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uXG4gICAgICAgICAgLmNyZWF0ZUluZGV4KGluZGV4KVxuICAgICAgICAgIC8vIFJldHJ5LCBidXQganVzdCBvbmNlLlxuICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICBtYXhUaW1lTVMsXG4gICAgICAgICAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgICAgICBoaW50LFxuICAgICAgICAgICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICAgICAgICAgIGV4cGxhaW4sXG4gICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGF0aW9uIHRvIHN1cHBvcnQgY2FzZSBpbnNlbnNpdGl2ZSBxdWVyaWVzXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uKCkge1xuICAgIHJldHVybiB7IGxvY2FsZTogJ2VuX1VTJywgc3RyZW5ndGg6IDIgfTtcbiAgfVxuXG4gIF9yYXdGaW5kKFxuICAgIHF1ZXJ5LFxuICAgIHtcbiAgICAgIHNraXAsXG4gICAgICBsaW1pdCxcbiAgICAgIHNvcnQsXG4gICAgICBrZXlzLFxuICAgICAgbWF4VGltZU1TLFxuICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICBoaW50LFxuICAgICAgY2FzZUluc2Vuc2l0aXZlLFxuICAgICAgZXhwbGFpbixcbiAgICAgIGNvbW1lbnQsXG4gICAgfSA9IHt9XG4gICkge1xuICAgIGxldCBmaW5kT3BlcmF0aW9uID0gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmZpbmQocXVlcnksIHtcbiAgICAgIHNraXAsXG4gICAgICBsaW1pdCxcbiAgICAgIHNvcnQsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjb21tZW50LFxuICAgIH0pO1xuXG4gICAgaWYgKGtleXMpIHtcbiAgICAgIGZpbmRPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uLnByb2plY3Qoa2V5cyk7XG4gICAgfVxuXG4gICAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkge1xuICAgICAgZmluZE9wZXJhdGlvbiA9IGZpbmRPcGVyYXRpb24uY29sbGF0aW9uKE1vbmdvQ29sbGVjdGlvbi5jYXNlSW5zZW5zaXRpdmVDb2xsYXRpb24oKSk7XG4gICAgfVxuXG4gICAgaWYgKG1heFRpbWVNUykge1xuICAgICAgZmluZE9wZXJhdGlvbiA9IGZpbmRPcGVyYXRpb24ubWF4VGltZU1TKG1heFRpbWVNUyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGxhaW4gPyBmaW5kT3BlcmF0aW9uLmV4cGxhaW4oZXhwbGFpbikgOiBmaW5kT3BlcmF0aW9uLnRvQXJyYXkoKTtcbiAgfVxuXG4gIGNvdW50KHF1ZXJ5LCB7IHNraXAsIGxpbWl0LCBzb3J0LCBtYXhUaW1lTVMsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBjb21tZW50IH0gPSB7fSkge1xuICAgIC8vIElmIHF1ZXJ5IGlzIGVtcHR5LCB0aGVuIHVzZSBlc3RpbWF0ZWREb2N1bWVudENvdW50IGluc3RlYWQuXG4gICAgLy8gVGhpcyBpcyBkdWUgdG8gY291bnREb2N1bWVudHMgcGVyZm9ybWluZyBhIHNjYW4sXG4gICAgLy8gd2hpY2ggZ3JlYXRseSBpbmNyZWFzZXMgZXhlY3V0aW9uIHRpbWUgd2hlbiBiZWluZyBydW4gb24gbGFyZ2UgY29sbGVjdGlvbnMuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BdXRvbWF0dGljL21vbmdvb3NlL2lzc3Vlcy82NzEzIGZvciBtb3JlIGluZm8gcmVnYXJkaW5nIHRoaXMgcHJvYmxlbS5cbiAgICBpZiAodHlwZW9mIHF1ZXJ5ICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5lc3RpbWF0ZWREb2N1bWVudENvdW50KHtcbiAgICAgICAgbWF4VGltZU1TLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRPcGVyYXRpb24gPSB0aGlzLl9tb25nb0NvbGxlY3Rpb24uY291bnREb2N1bWVudHMocXVlcnksIHtcbiAgICAgIHNraXAsXG4gICAgICBsaW1pdCxcbiAgICAgIHNvcnQsXG4gICAgICBtYXhUaW1lTVMsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjb21tZW50LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50T3BlcmF0aW9uO1xuICB9XG5cbiAgZGlzdGluY3QoZmllbGQsIHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kaXN0aW5jdChmaWVsZCwgcXVlcnkpO1xuICB9XG5cbiAgYWdncmVnYXRlKHBpcGVsaW5lLCB7IG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGV4cGxhaW4sIGNvbW1lbnQgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvblxuICAgICAgLmFnZ3JlZ2F0ZShwaXBlbGluZSwgeyBtYXhUaW1lTVMsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluLCBjb21tZW50IH0pXG4gICAgICAudG9BcnJheSgpO1xuICB9XG5cbiAgaW5zZXJ0T25lKG9iamVjdCwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uaW5zZXJ0T25lKG9iamVjdCwgeyBzZXNzaW9uIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSB1cGRhdGVzIGRhdGEgaW4gdGhlIGRhdGFiYXNlIGZvciBhIHNpbmdsZSAoZmlyc3QpIG9iamVjdCB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5XG4gIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSAtIGRvZXMgaW5zZXJ0XG4gIC8vIFBvc3RncmVzIE5vdGU6IGBJTlNFUlQgLi4uIE9OIENPTkZMSUNUIFVQREFURWAgdGhhdCBpcyBhdmFpbGFibGUgc2luY2UgOS41LlxuICB1cHNlcnRPbmUocXVlcnksIHVwZGF0ZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUsIHtcbiAgICAgIHVwc2VydDogdHJ1ZSxcbiAgICAgIHNlc3Npb24sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVPbmUocXVlcnksIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlTWFueShxdWVyeSwgdXBkYXRlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi51cGRhdGVNYW55KHF1ZXJ5LCB1cGRhdGUsIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1hbnkocXVlcnksIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRlbGV0ZU1hbnkocXVlcnksIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIF9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleFJlcXVlc3QpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KGluZGV4UmVxdWVzdCwge1xuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgYmFja2dyb3VuZDogdHJ1ZSxcbiAgICAgIHNwYXJzZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kcm9wKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTUEsT0FBTyxHQUFHQyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2xDLE1BQU1DLFVBQVUsR0FBR0YsT0FBTyxDQUFDRSxVQUFVO0FBRXRCLE1BQU1DLGVBQWUsQ0FBQztFQUduQ0MsV0FBV0EsQ0FBQ0MsZUFBMkIsRUFBRTtJQUN2QyxJQUFJLENBQUNDLGdCQUFnQixHQUFHRCxlQUFlO0VBQ3pDOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQUUsSUFBSUEsQ0FDRkMsS0FBSyxFQUNMO0lBQ0VDLElBQUk7SUFDSkMsS0FBSztJQUNMQyxJQUFJO0lBQ0pDLElBQUk7SUFDSkMsU0FBUztJQUNUQyxjQUFjO0lBQ2RDLElBQUk7SUFD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
|