Уникальное свойство Mongoose, по-прежнему позволяющее мне сохранять в БД

Я предполагаю, что добавление unique: true в поле остановит сохранение в базе данных с тем же значением. Но мне все еще разрешено это делать.

"мангуст": "^ 5.4.19",

const SessionSchema = new Schema({

    jobId: {
        type: String,
        required: false,
        unique: true,
        index: true,

    },
    productId: {
        type: String,
        required: true,
    },
    status: {
        type: String,
        default: "Pending",
    },
    mode: {
        type: String,
        default: "authentication",
    },
    result: {
        type: Schema.Types.Mixed,
    },
    requests: [RequestSchema],
    callback_at: {
        type: Date,
    },

}, {
        timestamps: { createdAt: "created_at", updatedAt: "updated_at" },
    });

Я уже пробовал удалить и воссоздать коллекцию. См. Изображение ниже, я могу создать новый сеанс с тем же идентификатором задания, равным 1.

введите здесь описание изображения

public store = async (req: Request, res: Response): Promise<any> => {

        const input = req.body;

        let session = new Session({
            productId: input.productId,
            jobId: input.jobId,
        });

        try {

            session = await session.save();

            const response = {
                success: true,
                status: 201,
                data: { session },
                message: "SESSION CREATED",
            };


            return res.status(response.status).json(response);

        } catch (err) {

            const response = {
                success: false,
                status: 500,
                errors: [],
                message: "UNEXPECTED SESSION ERROR",
            };

            if (err.code === 11000) {
                response.errors.push({
                    code: 11000,
                    message: "Duplicate key error jobId",
                });
            }


            return res.status(response.status).json(response);
        }

db.sessions.getIndex ();

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "myDB.sessions"
    }
]

person Kay    schedule 15.03.2019    source источник
comment
Можете ли вы обновить свой вопрос, чтобы показать результат db.sessions.getIndexes() (при условии, что это имя вашей коллекции)?   -  person JohnnyHK    schedule 15.03.2019
comment
После добавления поля unique: true вы перезапускали mongo? Связанная проблема (?): stackoverflow.com/questions/5535610 /   -  person Andrew Cameron    schedule 15.03.2019
comment
@AndrewCameron да, и я просто попробовал еще раз, чтобы убедиться, что я запускаю mongo в контейнере докеров, и я остановился и запустил контейнер mongo.   -  person Kay    schedule 15.03.2019
comment
Этот ответ вводит в заблуждение. Вам не нужно перезапускать mongodb, чтобы уникальный индекс работал. Я хотел бы избавиться от этой дезинформации.   -  person JohnnyHK    schedule 15.03.2019
comment
@JohnnyHK Я обновил исходный вопрос выводом. Похоже, что jobId там нет, но почему ...   -  person Kay    schedule 15.03.2019
comment
Я только что увидел это - mongoosejs.com/ docs /   -  person Kay    schedule 15.03.2019
comment
Вы устанавливаете autoIndex: false в своем mongoose.connect звонке? Если это так, вы можете вызвать Sessions.ensureIndexes(), чтобы вручную запросить создание.   -  person JohnnyHK    schedule 15.03.2019
comment
в моих параметрах mongoose.connect у меня есть параметры: {useNewUrlParser: true, useCreateIndex: true,},   -  person Kay    schedule 15.03.2019
comment
Итак, я должен ждать Sessions.ensureIndexes () перед тем, как выполнять sessions.save (),?   -  person Kay    schedule 15.03.2019
comment
Нет, я предполагаю, что создание индекса не удается из-за существующих документов с повторяющимися jobIds. См. здесь, чтобы узнать, как это можно отладить.   -  person JohnnyHK    schedule 15.03.2019
comment
@JohnnyHK хорошо, я работаю локально, поэтому я просто могу удалить db и воссоздать. так что я не думаю, что это так   -  person Kay    schedule 15.03.2019
comment
После удаления всего я все еще могу делать дубликаты   -  person Kay    schedule 15.03.2019
comment
Добавление `autoIndex: true` к моим параметрам подключения мангуста, похоже, отлично работает   -  person Kay    schedule 15.03.2019


Ответы (2)


Вы должны понимать, что unique - это параметр конфигурации индекса в вашей схеме.

Например, если коллекция users не имеет уникального индекса на userName, вам нужно дождаться построения индекса, прежде чем вы начнете полагаться на него.

 const user = new mongoose.Schema({
    userName: { type: 'String', unique: true },

  });

    const User = db.model('User', user);

      const doc = new User({
        userName: 'Bob'
      });

      return User.init() // `User.init()` returns a promise that is fulfilled when all indexes are done
        .then(() => User.create(doc))
        .then(() => User.create({ userName: 'Bob' }));
    }
person Muhammad Areeb Siddiqui    schedule 15.03.2019

Я неправильно использовал уникальный: https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator

Прежде чем полагаться на валидатор, нужно дождаться создания индексов.

Я изменил параметры подключения мангуста, чтобы они выглядели следующим образом

 options: {
        useNewUrlParser: true,
        useCreateIndex: true,
        autoIndex: true,
    },

Я не уверен, что это наиболее подходящее решение, но на данный момент его нет.

person Kay    schedule 15.03.2019