Indeks unik pada bidang larik memaksa bahwa nilai yang sama tidak dapat muncul dalam larik lebih dari satu dokumen dalam koleksi, tetapi tidak mencegah nilai yang sama muncul lebih dari sekali dalam larik dokumen tunggal. Jadi, Anda perlu memastikan keunikan saat menambahkan elemen ke array.
Gunakan $addToSet operator untuk menambahkan nilai ke array hanya jika nilainya belum ada.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Namun, jika users array berisi objek dengan banyak properti dan Anda ingin memastikan keunikan hanya pada salah satunya (uid dalam hal ini), maka Anda perlu mengambil pendekatan lain:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Apa yang dilakukan adalah memenuhi syarat $push pembaruan hanya terjadi jika user.uid belum ada di uid bidang salah satu elemen users . Jadi meniru $addToSet perilaku, tetapi hanya untuk uid .