如何创建具有特定值的猫鼬唯一索引?
How do I create mongoose unique index with specific value?
我有一个名为 TradeRequest
的集合,其架构如下
const TradeRequestSchema = mongoose.Schema({
status: {
type: String,
enum: ["opened", "rejected", "accepted"],
default: "opened"
},
_requester: {
required: true,
type: mongoose.Schema.Types.ObjectId
},
_requestedBook: {
required: true,
type: mongoose.Schema.Types.ObjectId
}
});
我的数据库应该只有 一个任何人对一本书的公开请求。
所以我像这样添加了一个唯一索引 -
TradeRequestSchema.index({_requester: 1, _requestedBook: 1, status: 1}, {unique: true});
问题是这会阻止一些数据被输入到数据库中,而这些数据本应被允许。
例如,它会阻止我的数据库包含以下适合我的用例的文档 -
{_id: 1, _requester: 12345, _requestedBook: 9871212, status: "opened"}
{_id: 2, _requester: 12345, _requestedBook: 9871212, status: "opened"}
但它也可以防止以下对我的用例来说是错误的。
例如,如果我的数据库已经有以下文件 -
{_id: 3, _requester: 12345, _requestedBook: 9871212, status: "closed"}
{_id: 4, _requester: 12345, _requestedBook: 9871212, status: "opened"}
我现在无法将 ID 为 4
的请求更改为 closed
,这是错误的。
基本上我想要的是一个 opened
请求 book
但多个 closed
请求。
我该如何实现?
Mongodb 有许多类型的索引,如唯一索引、稀疏索引和部分索引。您的案例不仅需要唯一索引,还需要 unique partial index。
尝试创建类似 -
的内容
db.<<collectionName>>.createIndex(
{_requester: 1, _requestedBook: 1, status: 1},
{unique: true, partialFilterExpression: { "status" : "opened" }}
)
希望对您有所帮助...
我有一个名为 TradeRequest
的集合,其架构如下
const TradeRequestSchema = mongoose.Schema({
status: {
type: String,
enum: ["opened", "rejected", "accepted"],
default: "opened"
},
_requester: {
required: true,
type: mongoose.Schema.Types.ObjectId
},
_requestedBook: {
required: true,
type: mongoose.Schema.Types.ObjectId
}
});
我的数据库应该只有 一个任何人对一本书的公开请求。
所以我像这样添加了一个唯一索引 -
TradeRequestSchema.index({_requester: 1, _requestedBook: 1, status: 1}, {unique: true});
问题是这会阻止一些数据被输入到数据库中,而这些数据本应被允许。
例如,它会阻止我的数据库包含以下适合我的用例的文档 -
{_id: 1, _requester: 12345, _requestedBook: 9871212, status: "opened"}
{_id: 2, _requester: 12345, _requestedBook: 9871212, status: "opened"}
但它也可以防止以下对我的用例来说是错误的。
例如,如果我的数据库已经有以下文件 -
{_id: 3, _requester: 12345, _requestedBook: 9871212, status: "closed"}
{_id: 4, _requester: 12345, _requestedBook: 9871212, status: "opened"}
我现在无法将 ID 为 4
的请求更改为 closed
,这是错误的。
基本上我想要的是一个 opened
请求 book
但多个 closed
请求。
我该如何实现?
Mongodb 有许多类型的索引,如唯一索引、稀疏索引和部分索引。您的案例不仅需要唯一索引,还需要 unique partial index。 尝试创建类似 -
的内容db.<<collectionName>>.createIndex(
{_requester: 1, _requestedBook: 1, status: 1},
{unique: true, partialFilterExpression: { "status" : "opened" }}
)
希望对您有所帮助...