diff --git a/packages/mongodb/src/MongoPlatform.ts b/packages/mongodb/src/MongoPlatform.ts index c9266eb9e35e..eb7b90ac2d91 100644 --- a/packages/mongodb/src/MongoPlatform.ts +++ b/packages/mongodb/src/MongoPlatform.ts @@ -65,7 +65,7 @@ export class MongoPlatform extends Platform { } override convertJsonToDatabaseValue(value: unknown): unknown { - return value; + return Utils.copy(value); } override convertJsonToJSValue(value: unknown): unknown { diff --git a/tests/features/custom-types/GH5572.test.ts b/tests/features/custom-types/GH5572.test.ts new file mode 100644 index 000000000000..1efd2c688b0b --- /dev/null +++ b/tests/features/custom-types/GH5572.test.ts @@ -0,0 +1,40 @@ +import { Entity, MikroORM, PrimaryKey, Property } from '@mikro-orm/mongodb'; + +@Entity() +class Dummy { + + @PrimaryKey() + _id!: number; + + @Property({ type: 'json' }) + a!: { b: number }; + +} + +let orm: MikroORM; + +beforeAll(async () => { + orm = await MikroORM.init({ + dbName: '5572', + entities: [Dummy], + }); + await orm.schema.refreshDatabase(); +}); + +afterAll(async () => { + await orm.close(true); +}); + +test('deep update', async () => { + const usr1 = orm.em.create(Dummy, { _id: 1, a: { b: 1 } }); + await orm.em.flush(); + orm.em.clear(); + + const usr2 = await orm.em.findOneOrFail(Dummy, usr1._id); + usr2.a.b = 100; + await orm.em.flush(); + orm.em.clear(); + + const usr3 = await orm.em.findOneOrFail(Dummy, usr1._id); + expect(usr3.a.b).toBe(100); +});