Can you specify a key for $addToSet in Mongo?

2019-01-01 07:22发布

问题:

I have a document:

{ \'profile_set\' :
  [
    { \'name\' : \'nick\', \'options\' : 0 },
    { \'name\' : \'joe\',  \'options\' : 2 },
    { \'name\' : \'burt\', \'options\' : 1 }
  ] 
}

and would like to add a new document to the profile_set set if the name doesn\'t already exist (regardless of the option).

So in this example if I tried to add:

{\'name\' : \'matt\', \'options\' : 0}

it should add it, but adding

{\'name\' : \'nick\', \'options\' : 2}

should do nothing because a document already exists with name nick even though the option is different.

Mongo seems to match against the whole element and I end up with to check if it\'s the same and I end up with

profile_set containing [{\'name\' : \'nick\', \'options\' : 0}, {\'name\' : \'nick\', \'options\' : 2}]

Is there a way to do this with $addToSet or do I have to push another command?

回答1:

You can qualify your update with a query object that prevents the update if the name is already present in profile_set. In the shell:

db.coll.update(
    {_id: id, \'profile_set.name\': {$ne: \'nick\'}}, 
    {$push: {profile_set: {\'name\': \'nick\', \'options\': 2}}})

So this will only perform the $push for a doc with a matching _id and where there isn\'t a profile_set element where name is \'nick\'.