配列フィールドの一意のインデックスにより、同じ値が複数のドキュメントの配列に表示されないようになります。 コレクション内にありますが、同じ値が単一のドキュメントの配列に複数回表示されるのを防ぐことはできません。したがって、代わりに配列に要素を追加するときに一意性を確保する必要があります。
$addToSetを使用します 値がまだ存在しない場合にのみ配列に値を追加する演算子。
Group.updateOne({name: 'admin'}, {$addToSet: {users: userOid}}, ...
ただし、users 配列には複数のプロパティを持つオブジェクトが含まれており、そのうちの1つだけで一意性を確保する必要があります(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のみ 。