Mongoose unique 属性 仍然允许我保存到数据库
Mongoose unique property still allowing me to save to db
我假设将 unique: true 添加到字段将停止使用相同的值保存到数据库。但我仍然允许这样做。
"mongoose": "^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 为 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"
}
]
您必须了解 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' }));
}
我没有正确使用 unique:https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator
需要等到索引建立好之后再依赖unique做验证器
我将 mongoose 连接选项更改为如下所示
options: {
useNewUrlParser: true,
useCreateIndex: true,
autoIndex: true,
},
我不确定它是否是最合适的解决方案,但它是我目前采用的解决方案。
我假设将 unique: true 添加到字段将停止使用相同的值保存到数据库。但我仍然允许这样做。
"mongoose": "^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 为 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"
}
]
您必须了解 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' }));
}
我没有正确使用 unique:https://mongoosejs.com/docs/validation.html#the-unique-option-is-not-a-validator
需要等到索引建立好之后再依赖unique做验证器
我将 mongoose 连接选项更改为如下所示
options: {
useNewUrlParser: true,
useCreateIndex: true,
autoIndex: true,
},
我不确定它是否是最合适的解决方案,但它是我目前采用的解决方案。