如何创建具有特定值的猫鼬唯一索引?

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

希望对您有所帮助...