Chỉ mục duy nhất trên một trường mảng thực thi rằng cùng một giá trị không thể xuất hiện trong các mảng của nhiều hơn một tài liệu trong bộ sưu tập, nhưng không ngăn cùng một giá trị xuất hiện nhiều lần trong mảng của một tài liệu. Vì vậy, bạn cần đảm bảo tính duy nhất khi thêm các phần tử vào mảng.
Sử dụng $addToSet
toán tử để thêm giá trị vào một mảng chỉ khi giá trị đó chưa có.
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
Tuy nhiên, nếu users
mảng chứa các đối tượng có nhiều thuộc tính và bạn muốn đảm bảo tính duy nhất cho chỉ một trong số chúng (uid
trong trường hợp này), thì bạn cần thực hiện một cách tiếp cận khác:
var user = { uid: userOid, ... };
Group.updateOne(
{name: 'admin', 'users.uid': {$ne: user.uid}},
{$push: {users: user}},
function(err, numAffected) { ... });
Điều đó làm đủ điều kiện cho $push
cập nhật chỉ xảy ra nếu user.uid
chưa tồn tại trong uid
trường của bất kỳ phần tử nào của users
. Vì vậy, nó bắt chước $addToSet
hành vi, nhưng chỉ đối với uid
.