Как указать поле, которое является массивом объектов, объекты массива имеют один из атрибутов как уникальный, но необязательный в Mongoose? - PullRequest
0 голосов
/ 28 декабря 2018

Это моя схема для персональной информации сотрудника

const mongoose = require('mongoose');
const PersonalInformationSchema = mongoose.Schema({
name: {
        type: String,
        required: true
    },
emails: [{
        email: {
            type: String,
            trim: true,
            unique: true
        },
        isPrimary: {
            type: Boolean
        }
    }]
}, {
    timestamps: true
});
module.exports = mongoose.model('PersonalInformation', PersonalInformationSchema);

В моем случае у меня есть массив emails, который является необязательным для сотрудника, но должен быть уникальным.Когда я вставляю запись без электронных писем, документ успешно сохраняется (с пустым массивом emails: []), но при следующей попытке он говорит

"err": {
        "driver": true,
        "name": "MongoError",
        "index": 0,
        "code": 11000,
        "errmsg": "E11000 duplicate key error collection: EmployeePersonalInformation.personalinformations index: emails.email_1 dup key: { : null }"
}

1 Ответ

0 голосов
/ 28 декабря 2018

Вы можете добавить sparse: true к своей схеме, попробуйте:

const PersonalInformationSchema = mongoose.Schema({
    name: {
            type: String,
            required: true
        },
    emails: [{
            email: {
                type: String,
                trim: true,
                unique: true, 
                sparse: true
            },
            isPrimary: {
                type: Boolean
            }
        }]
    }, {
        timestamps: true
});

Разреженное свойство индекса гарантирует, что индекс содержит записи только для документов, которые имеютиндексированное поле.Индекс пропускает документы, которые не имеют индексированного поля.

Поэтому, когда пустые документы будут пропущены, вы не получите сообщение об ошибке из ограничения unique.

...