diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index e430e94786..5e42a4f26d 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -174,11 +174,12 @@ module.exports = function (module) { } const data = {}; - fields.forEach((field) => { + fields = fields.map((field) => { field = helpers.fieldToString(field); if (field) { data[field] = 1; } + return field; }); const item = await module.client.collection('objects').findOne({ _key: key }, { projection: data }); diff --git a/src/database/mongo/helpers.js b/src/database/mongo/helpers.js index 4259771b2e..46ef8b39cb 100644 --- a/src/database/mongo/helpers.js +++ b/src/database/mongo/helpers.js @@ -23,7 +23,9 @@ helpers.fieldToString = function (field) { field = field.toString(); } // if there is a '.' in the field name it inserts subdocument in mongo, replace '.'s with \uff0E - return field.replace(/\./g, '\uff0E'); + // replace $ with \uff04 so we can use $ in document fields + return field.replace(/\./g, '\uff0E') + .replace(/\$/g, '\uFF04'); }; helpers.serializeData = function (data) { diff --git a/test/database/hash.js b/test/database/hash.js index ab422e1ae6..571cf8bb95 100644 --- a/test/database/hash.js +++ b/test/database/hash.js @@ -155,18 +155,21 @@ describe('Hash methods', () => { }); }); - it('should work for field names with "." in them when they are cached', (done) => { - db.setObjectField('dotObject3', 'my.dot.field', 'foo2', (err) => { - assert.ifError(err); - db.getObject('dotObject3', (err, data) => { - assert.ifError(err); - db.getObjectField('dotObject3', 'my.dot.field', (err, value) => { - assert.ifError(err); - assert.equal(value, 'foo2'); - done(); - }); - }); - }); + it('should work for field names with "." in them when they are cached', async () => { + await db.setObjectField('dotObject3', 'my.dot.field', 'foo2'); + const data = await db.getObject('dotObject3'); + assert.strictEqual(data['my.dot.field'], 'foo2'); + const value = await db.getObjectField('dotObject3', 'my.dot.field'); + assert.equal(value, 'foo2'); + }); + + it('should work for fields that start with $', async () => { + await db.setObjectField('dollarsign', '$someField', 'foo'); + assert.strictEqual(await db.getObjectField('dollarsign', '$someField'), 'foo'); + assert.strictEqual(await db.isObjectField('dollarsign', '$someField'), true); + assert.strictEqual(await db.isObjectField('dollarsign', '$doesntexist'), false); + await db.deleteObjectField('dollarsign', '$someField'); + assert.strictEqual(await db.isObjectField('dollarsign', '$someField'), false); }); });