Mongoose: как определить комбинацию полей, чтобы быть уникальными?

Если бы у меня была такая схема:

var person = new Schema({ firstName: String, lastName: String, }); 

Я хотел бы убедиться, что есть только один документ с тем же именем firstName и lastName.

Как я могу это сделать?

    3 Solutions collect form web for “Mongoose: как определить комбинацию полей, чтобы быть уникальными?”

    Вы можете определить уникальный составной индекс, используя index вызов в вашей схеме:

     person.index({ firstName: 1, lastName: 1}, { unique: true }); 

    Интересная мелочь, которую я только недавно обнаружил, экспериментируя с Mongoose. Например, у меня есть следующая схема:

     const ShapesSchema = new mongoose.Schema({ name: { type: String, required: true }, user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } }) ShapesSchema.index({ name: 1, user: 1 }, { unique: true }) mongoose.model('Shapes', ShapesSchema) 

    Идея заключалась в создании составного индекса, который был уникален по name и user вместе. Таким образом, пользователь мог бы создать столько фигур, сколько захотелось, если каждая из их форм имела четкое имя. И обратный должен был быть правдивым, так как формы могут иметь одно и то же имя, если у них разные пользователи. Для меня это не получилось.

    Я заметил, что кроме индекса на _id были созданы три другие записи индекса. Каждый из них для name , user и name_user должен быть уникальным. Я внес изменения в схему и включил unique: false для каждого из полей, которые я использовал для составного индекса, и внезапно все это работало, как ожидалось. То, что я закончил, было:

     const ShapesSchema = new mongoose.Schema({ name: { type: String, required: true, unique: false }, user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', unique: false } }) ShapesSchema.index({ name: 1, user: 1 }, { unique: true }) mongoose.model('Shapes', ShapesSchema) 

    Глядя на индексы, которые были созданы в результате, я все еще вижу три индекса – name , name user и name_user . Но разница в том, что первые два не являются уникальными, где последний, состав, есть. Теперь мой пример использования нескольких различных фигур на пользователя или идентично названных фигур с разными пользователями работает как чемпион.

    Я не пробовал это, но использование уникального индекса должно сделать трюк.

     db.person.ensureIndex( { "firstname": 1, "lastname": 1 }, { unique: true } ) 
    Давайте будем гением компьютера.