Victor Castro
Victor Castro

Reputation: 1242

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 '.'

Upvotes: 1

Views: 52

Answers (1)

U Rogel
U Rogel

Reputation: 1941

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.

Upvotes: 1

Related Questions