猫鼬独特的属性仍然允许我保存到数据库

时间:2019-03-15 16:15:50

标签: node.js mongoose mongoose-schema

在为字段添加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" },
    });

我已经尝试删除并重新创建集合。参见下图,我可以使用相同的jobId创建一个新会话。

enter image description here

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"
    }
]

2 个答案:

答案 0 :(得分:5)

您必须了解,唯一性是架构中的索引配置选项。

例如,如果'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' }));
    }

答案 1 :(得分:1)

我没有正确使用唯一性:https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator

需要等待索引建立之后,才能依赖于unique作为验证者。

我将猫鼬的连接选项更改为如下所示

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

我;我不确定它是否是最合适的解决方案,但目前还没有它。