配列フィールドの一意のインデックスにより、同じ値が複数のドキュメントの配列に表示されないようになります。 コレクション内にありますが、同じ値が単一のドキュメントの配列に複数回表示されるのを防ぐことはできません。したがって、代わりに配列に要素を追加するときに一意性を確保する必要があります。
$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
のみ 。