在为字段添加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创建一个新会话。
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"
}
]
答案 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,
},
我;我不确定它是否是最合适的解决方案,但目前还没有它。