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 = {};
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 });

View File

@@ -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) {

View File

@@ -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);
});
});