次のように、Mongoose を使用して、MongoDB で一意でスパースになるスキーマの 2 つのフィールドにインデックスを作成しようとしています。
var ArraySchema = new Schema ({
user_id: {type: mongoose.Schema.Types.ObjectId, ref:'User'},
event_id: {type: mongoose.Schema.Types.ObjectId, ref:'Event'}
}, {_id:false});
ListSchema.index({user_id:1, event_id:1}, {sparse:true, unique:true});
次に、 User スキーマの配列で次のように使用されます。
var User = new Schema({
arrayType1 : {
type: [ArraySchema]
},
arrayType2 : {
type: [ArraySchema]
},
arrayType3 : {
type: [ArraySchema]
}
//More specifications for user schema...
});
ただし、フィールドを指定せずに複数のユーザーを保存しようとするとarray
、重複するフィールドに対してエラーがスローされます。Mocha のエラーは次のようになりますarray.event_id_1 dup key {null, null}
。このエラーをスローするコード セグメントの例は次のとおりです。
var user1, user2;
user1 = new User({
username : 'username1',
password : 'password'
});
user2 = new User({
username : 'username2',
password : 'password'
});
user1.save(function() {
user2.save();
});
ArraySchema のフィールドを一意でスパースにする理由は次のとおりです。フィールドが指定されている場合array
、配列に重複したオブジェクトを含めたくありません。ただし、array
フィールドは必須ではないため、このフィールドを持っているユーザーが多数存在null
します。arrayType1
明らかに、インデックス ( 、arrayType2
、 )を必要とする複数のフィールドがあるため、フィールド レベルのインデックスは使用できませんarrayType3
。