5

私はマングースに次のスキーマを持っています:

UserSchema = new Schema
    username: {type: String, required: true}

GameSchema = new Schema
    identifier: String
    users: [UserSchema]

ゲーム内のすべてのユーザーが一意のユーザー名を持つようにしたいと考えています。ただし、追加すると

unique: true

ユーザー名の定義に追加すると、ユーザーが存在するゲーム内だけでなく、すべてのゲームで一意性が強制されるようです。また、ユーザーがいないゲームが複数ある場合、次のエラーが発生します。

games.$users.username_1  dup key: { : null }

ユーザー名フィールドにカスタムバリデーターを追加して、そのユーザー名が既に親ゲームの範囲内にあるかどうかを手動で確認しようとしましたが、マングースではバリデーター関数はユーザー名の実際の文字列のみを受け取るため、方法がありませんバリデーター関数で親ゲーム ドキュメントへの参照を取得できないため、ユーザー名がゲーム内で一意であることを確認します。

マングースでこの種の検証を行う方法はありますか?

4

2 に答える 2

5

お気づきのように、配列のフィールドに一意のインデックスを追加しても、配列内で一意性が強制されるわけではなく、コレクション内の 2 つのドキュメントに配列内の同じフィールド値が含まれないようにします。

代わりに、$addToSet配列演算子は、値がまだ配列にない場合にのみ、値を配列にアトミックに追加する方法と考えてください。

于 2012-12-17T02:03:52.420 に答える
1

これは、次のようにして簡単に実現できます。

doc.array.addToSet(4,5);

次のようにしてそれらを削除できます。

doc.array.pull(4,5);
doc.array.remove(4,5); //alias of .pull()

http://mongoosejs.com/docs/api.html#types_array_MongooseArray-addToSet http://mongoosejs.com/docs/api.html#types_array_MongooseArray-pull

于 2014-06-07T05:15:47.450 に答える