From 6defe06b0bbfa4438f983654a557074f56d6324f Mon Sep 17 00:00:00 2001 From: tenorok Date: Thu, 19 Nov 2020 23:02:32 +0300 Subject: [PATCH 1/3] fix: Similar _id field in original and cached queries. --- src/extend-query.js | 14 ++++++++++++++ test/index.js | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/extend-query.js b/src/extend-query.js index 8089ffb..c856957 100644 --- a/src/extend-query.js +++ b/src/extend-query.js @@ -34,6 +34,10 @@ module.exports = function(mongoose, cache) { cachedResults = Array.isArray(cachedResults) ? cachedResults.map(hydrateModel(constructor)) : hydrateModel(constructor)(cachedResults); + } else { + Array.isArray(cachedResults) ? + cachedResults.forEach(recoverObjectId(mongoose)) : + recoverObjectId(mongoose)(cachedResults); } callback(null, cachedResults); @@ -90,3 +94,13 @@ function hydrateModel(constructor) { return constructor.hydrate(data); }; } + +function recoverObjectId(mongoose) { + return data => { + if (!data._id) { + return data; + } + + data._id = mongoose.Types.ObjectId(data._id); + } +} diff --git a/test/index.js b/test/index.js index 215d822..b076209 100644 --- a/test/index.js +++ b/test/index.js @@ -351,6 +351,22 @@ describe('cachegoose', () => { const diffSort = await getAllSorted({ num: -1 }); diffSort.length.should.equal(20); }); + + it('should return similar _id in cached array result for lean', async () => { + const originalRes = await getAllLean(60); + const cachedRes = await getAllLean(60); + const originalConstructor = originalRes[0]._id.constructor.name.should; + const cachedConstructor = cachedRes[0]._id.constructor.name.should; + originalConstructor.should.deepEqual(cachedConstructor); + }); + + it('should return similar _id in one cached result for lean', async () => { + const originalRes = await getOneLean(60); + const cachedRes = await getOneLean(60); + const originalConstructor = originalRes._id.constructor.name.should; + const cachedConstructor = cachedRes._id.constructor.name.should; + originalConstructor.should.deepEqual(cachedConstructor); + }); }); function getAll(ttl, cb) { @@ -373,6 +389,10 @@ function getOne(ttl, cb) { return Record.findOne({ num: { $gt: 2 } }).cache(ttl).exec(cb); } +function getOneLean(ttl, cb) { + return Record.findOne({ num: { $gt: 2 } }).lean().cache(ttl).exec(cb); +} + function getWithSkip(skip, ttl, cb) { return Record.find({}).skip(skip).cache(ttl).exec(cb); } From 6345839575e7e6dbe3d65a2bfeef65fd2127ce43 Mon Sep 17 00:00:00 2001 From: tenorok Date: Thu, 19 Nov 2020 23:14:19 +0300 Subject: [PATCH 2/3] fix: Similar _id field in aggregate queries. --- src/extend-aggregate.js | 5 ++++- src/extend-query.js | 15 ++------------- src/recover-objectid.js | 18 ++++++++++++++++++ test/index.js | 16 ++++++++++++++++ 4 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 src/recover-objectid.js diff --git a/src/extend-aggregate.js b/src/extend-aggregate.js index b7d4f12..b5b66d7 100644 --- a/src/extend-aggregate.js +++ b/src/extend-aggregate.js @@ -1,6 +1,7 @@ 'use strict'; const generateKey = require('./generate-key'); +const recoverObjectId = require('./recover-objectid'); let hasBeenExtended = false; module.exports = function(mongoose, cache) { @@ -28,7 +29,9 @@ module.exports = function(mongoose, cache) { return new Promise((resolve, reject) => { cache.get(key, (err, cachedResults) => { //eslint-disable-line handle-callback-err - if (cachedResults) { + if (cachedResults != null) { + cachedResults = recoverObjectId(mongoose, cachedResults); + callback(null, cachedResults); return resolve(cachedResults); } diff --git a/src/extend-query.js b/src/extend-query.js index c856957..118bbb9 100644 --- a/src/extend-query.js +++ b/src/extend-query.js @@ -1,6 +1,7 @@ 'use strict'; const generateKey = require('./generate-key'); +const recoverObjectId = require('./recover-objectid'); module.exports = function(mongoose, cache) { const exec = mongoose.Query.prototype.exec; @@ -35,9 +36,7 @@ module.exports = function(mongoose, cache) { cachedResults.map(hydrateModel(constructor)) : hydrateModel(constructor)(cachedResults); } else { - Array.isArray(cachedResults) ? - cachedResults.forEach(recoverObjectId(mongoose)) : - recoverObjectId(mongoose)(cachedResults); + cachedResults = recoverObjectId(mongoose, cachedResults); } callback(null, cachedResults); @@ -94,13 +93,3 @@ function hydrateModel(constructor) { return constructor.hydrate(data); }; } - -function recoverObjectId(mongoose) { - return data => { - if (!data._id) { - return data; - } - - data._id = mongoose.Types.ObjectId(data._id); - } -} diff --git a/src/recover-objectid.js b/src/recover-objectid.js new file mode 100644 index 0000000..7c81cd0 --- /dev/null +++ b/src/recover-objectid.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = function(mongoose, cachedResults) { + return Array.isArray(cachedResults) ? + cachedResults.map(recoverObjectId(mongoose)) : + recoverObjectId(mongoose)(cachedResults); +}; + +function recoverObjectId(mongoose) { + return data => { + if (!data._id) { + return data; + } + + data._id = mongoose.Types.ObjectId(data._id); + return data; + } +} diff --git a/test/index.js b/test/index.js index b076209..9def74a 100644 --- a/test/index.js +++ b/test/index.js @@ -367,6 +367,14 @@ describe('cachegoose', () => { const cachedConstructor = cachedRes._id.constructor.name.should; originalConstructor.should.deepEqual(cachedConstructor); }); + + it('should return similar _id in cached array result for aggregate', async () => { + const originalRes = await aggregateAll(60); + const cachedRes = await aggregateAll(60); + const originalConstructor = originalRes[0]._id.constructor.name.should; + const cachedConstructor = cachedRes[0]._id.constructor.name.should; + originalConstructor.should.deepEqual(cachedConstructor); + }); }); function getAll(ttl, cb) { @@ -452,6 +460,14 @@ function aggregate(ttl, cb) { .exec(cb); } +function aggregateAll(ttl, cb) { + return Record.aggregate([ + { $match: {}}, + ]) + .cache(ttl) + .exec(cb); +} + function generate(amount) { const records = []; let count = 0; From 87f5c20d034e7a09e1ecb9bc1461865e79d3da20 Mon Sep 17 00:00:00 2001 From: tenorok Date: Tue, 23 Feb 2021 15:31:16 +0300 Subject: [PATCH 3/3] fixup! fix: Similar _id field in aggregate queries. --- src/recover-objectid.js | 29 ++++++++++++++++++----------- test/index.js | 2 +- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/recover-objectid.js b/src/recover-objectid.js index 7c81cd0..6010f77 100644 --- a/src/recover-objectid.js +++ b/src/recover-objectid.js @@ -1,18 +1,25 @@ 'use strict'; module.exports = function(mongoose, cachedResults) { - return Array.isArray(cachedResults) ? - cachedResults.map(recoverObjectId(mongoose)) : - recoverObjectId(mongoose)(cachedResults); -}; + if (!Array.isArray(cachedResults)) { + return recoverObjectId(mongoose, cachedResults); + } -function recoverObjectId(mongoose) { - return data => { - if (!data._id) { - return data; - } + const recoveredResult = []; - data._id = mongoose.Types.ObjectId(data._id); - return data; + for (const doc of cachedResults) { + recoveredResult.push(recoverObjectId(mongoose, doc)); } + + return recoveredResult; +}; + +function recoverObjectId(mongoose, doc) { + if (!doc._id) { + return doc; + } + + // eslint-disable-next-line new-cap + doc._id = mongoose.Types.ObjectId(doc._id); + return doc; } diff --git a/test/index.js b/test/index.js index 9def74a..9199e3d 100644 --- a/test/index.js +++ b/test/index.js @@ -462,7 +462,7 @@ function aggregate(ttl, cb) { function aggregateAll(ttl, cb) { return Record.aggregate([ - { $match: {}}, + { $match: {} }, ]) .cache(ttl) .exec(cb);