Если бы у меня была такая схема:
var person = new Schema({
firstName: String,
lastName: String,
});
Я хотел бы убедиться, что есть только один документ с тем же именем firstName и lastName.
Как я могу это сделать?
Если бы у меня была такая схема:
var person = new Schema({
firstName: String,
lastName: String,
});
Я хотел бы убедиться, что есть только один документ с тем же именем firstName и lastName.
Как я могу это сделать?
Вы можете определить уникальный составной индекс, используя вызов 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
, user
и name_user
. Но разница в том, что первые два не являются уникальными там, где находится последний, составной. Теперь мой сценарий использования нескольких отдельных фигур на пользователя или идентичных имен фигур с разными пользователями работает как победитель.
Я не пробовал это, но использование уникального индекса должно сделать трюк.
db.person.ensureIndex( { "firstname": 1, "lastname": 1 }, { unique: true } )
определяя вашу схему, как это
var person = new Schema({
firstName: String,
lastName: String,
index: true,
unique: true,
});
или же
person.index({ firstName: 1, lastName: 1}, { unique: true });
const personSchema = new Schema({ firstName: String, lastName: String });
const person = mongoose.model('recipients', personSchema);
person.createIndexes();
Вам может понадобиться избавиться от всех дубликатов в коллекции или сделать это быстрее и проще:
Отредактируйте свой код, удалите коллекцию и перезапустите Mongo.