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
.