Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Забавная мелочь, которую я только недавно обнаружил, экспериментируя с 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, user и name_user. Но разница в том, что первые два не являются уникальными там, где находится последний, составной. Теперь мой сценарий использования нескольких отдельных фигур на пользователя или идентичных имен фигур с разными пользователями работает как победитель.

Ответ 3

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

db.person.ensureIndex( { "firstname": 1, "lastname": 1 }, { unique: true } )

Ответ 4

определяя вашу схему, как это


var person = new Schema({
firstName:  String,
lastName: String,
index: true,
unique: true, 

});

или же


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

Ответ 5

const personSchema = new Schema({ firstName:  String, lastName: String });
const person = mongoose.model('recipients', personSchema);
person.createIndexes();

Вам может понадобиться избавиться от всех дубликатов в коллекции или сделать это быстрее и проще:

Отредактируйте свой код, удалите коллекцию и перезапустите Mongo.