пн goose схема уникальна по 2 полям - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь установить 2 поля так, чтобы они были уникальными и не имели дубликатов.

Код такой:

const Connection = mongoose.model("Connection", new mongoose.Schema({
    from_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    },
    to_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    }
}))
exports.Connection = Connection;

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вы можете сделать это, используя уникальный индекс, который включает оба поля


const ConnectionSchema = mongoose.Schema({
    from_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    },
    to_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    }
});

ConnectionSchema.index({ from_friend: 1, to_friend: 1 }, { unique: true });
module.exports = mongoose.model('Connection', ConnectionSchema);

0 голосов
/ 04 мая 2020

Уникальная опция не является валидатором

Обычная ошибка для начинающих заключается в том, что уникальная опция для схем не является валидатором. Это удобный помощник для создания уникальных индексов MongoDB. См. FAQ для получения дополнительной информации.

Из FAQ :

Q. Я объявил свойство схемы уникальным, но могу сохранять дубликаты. Что дает?

A. Mon goose не обрабатывает уникальность самостоятельно: { name: { type: String, unique: true } } - это просто сокращение для создания уникального индекса MongoDB по имени. Например, если у MongoDB еще нет уникального индекса по имени, приведенный ниже код не выдаст ошибку, несмотря на тот факт, что unique - true.

var schema = new mongoose.Schema({ name: { type: String, unique: true } }); var Model = db.model('Test', schema); Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) { console.log(err); // No error, unless index was already built });

Однако, если вы подождете для построения индекса с использованием события Model.on('index') попытки сохранить дубликаты будут корректно завершены.

Вам потребуется написать собственный пользовательский валидатор .

Если встроенных валидаторов недостаточно, вы можете определить собственные валидаторы в соответствии с вашими потребностями.

Пользовательская валидация объявляется путем передачи функции валидации. Подробные инструкции о том, как это сделать, можно найти в документации API SchemaType # validate ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...