fix: #13007, replace $ with \uFF04, like .

This commit is contained in:
Barış Soner Uşaklı
2024-12-24 12:37:06 -05:00
parent f478adac2f
commit c60cee5997
3 changed files with 20 additions and 14 deletions

View File

@@ -174,11 +174,12 @@ module.exports = function (module) {
} }
const data = {}; const data = {};
fields.forEach((field) => { fields = fields.map((field) => {
field = helpers.fieldToString(field); field = helpers.fieldToString(field);
if (field) { if (field) {
data[field] = 1; data[field] = 1;
} }
return field;
}); });
const item = await module.client.collection('objects').findOne({ _key: key }, { projection: data }); const item = await module.client.collection('objects').findOne({ _key: key }, { projection: data });

View File

@@ -23,7 +23,9 @@ helpers.fieldToString = function (field) {
field = field.toString(); field = field.toString();
} }
// if there is a '.' in the field name it inserts subdocument in mongo, replace '.'s with \uff0E // 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) { helpers.serializeData = function (data) {

View File

@@ -155,18 +155,21 @@ describe('Hash methods', () => {
}); });
}); });
it('should work for field names with "." in them when they are cached', (done) => { it('should work for field names with "." in them when they are cached', async () => {
db.setObjectField('dotObject3', 'my.dot.field', 'foo2', (err) => { await db.setObjectField('dotObject3', 'my.dot.field', 'foo2');
assert.ifError(err); const data = await db.getObject('dotObject3');
db.getObject('dotObject3', (err, data) => { assert.strictEqual(data['my.dot.field'], 'foo2');
assert.ifError(err); const value = await db.getObjectField('dotObject3', 'my.dot.field');
db.getObjectField('dotObject3', 'my.dot.field', (err, value) => { assert.equal(value, 'foo2');
assert.ifError(err); });
assert.equal(value, 'foo2');
done(); 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);
}); });
}); });