Search code examples
javascriptmongodbmeteorminimongo

Upsert data with a dynamic field name


I just try to do something simple with Mongo but it doesn't work:

I want to upsert datas in an object like: module.xxx.yyy then I tried many things like :

UsersRights.upsert({
	condoId: condoId,
	userId: manager._id,
}, {
	condoId: condoId,
	userId: manager._id,
	module: {
		[defaultRight.xxx] : {
			[defaultRight.yyy] : defaultRight.default
		}
	}
});

but when I want to add a new xxx or a new yyy, it will erase and replace the entire module object and not only add a new key.

I also tried this :

UsersRights.upsert({
	condoId: condoId,
	userId: manager._id,
}, {
	condoId: condoId,
	userId: manager._id,
	["module." + defaultRight.module + "." + defaultRight.right] : defaultRight.default,
});

but the server show me an error like: MinimongoError: Key module.xxx.yyy must not contain '.'


Solution

  • You need to use the following form:

    YourCollection.upsert({
        _id: id, (can be other selectors as well)
    }, {
        $set: setter
    });
    

    Setter is an object you create before and should have the following form:

    const setter = {};
    setter[`${#1Level}.${#2Level}`] = data;
    

    Where #1Level & #2Level are vars naming the fields you want to modify or to add.