Уникален индекс на поле на масив налага, че една и съща стойност не може да се появи в масивите на повече от един документ в колекцията, но не пречи на една и съща стойност да се появява повече от веднъж в масива на един документ. Така че трябва да гарантирате уникалност, докато добавяте елементи към масива вместо това.
Използвайте $addToSet
оператор за добавяне на стойност към масив само ако стойността вече не е налице.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Въпреки това, ако users
масивът съдържа обекти с множество свойства и искате да гарантирате уникалност само върху едно от тях (uid
в този случай), тогава трябва да предприемете друг подход:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Това, което прави, е да квалифицира $push
актуализиране да се извършва само ако user.uid
вече не съществува в uid
поле на някой от елементите на users
. Така че имитира $addToSet
поведение, но само за uid
.