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

Yas*_*ain 0 mongoose mongodb node.js mongoose-schema

我有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
  }
});
Run Code Online (Sandbox Code Playgroud)

我的数据库应该只有一个任何人对一本书的开放请求。
所以我添加了一个唯一索引,如下所示 -

TradeRequestSchema.index({_requester: 1, _requestedBook: 1, status: 1}, {unique: true});
Run Code Online (Sandbox Code Playgroud)

问题是这会阻止一些本应允许的数据输入到数据库中。

例如,它阻止我的数据库包含以下文档,这对于我的用例来说很好 -

{_id: 1, _requester: 12345, _requestedBook: 9871212, status: "opened"}
{_id: 2, _requester: 12345, _requestedBook: 9871212, status: "opened"}
Run Code Online (Sandbox Code Playgroud)

但它也可以防止以下情况对我的用例来说是错误的。

例如,如果我的数据库已有以下文档 -

{_id: 3, _requester: 12345, _requestedBook: 9871212, status: "closed"}
{_id: 4, _requester: 12345, _requestedBook: 9871212, status: "opened"}
Run Code Online (Sandbox Code Playgroud)

4我现在无法更改带有 id 的请求,closed这是错误的。

基本上我想要的是对多个请求有一个opened请求。bookclosed

我该如何实现这一目标?

小智 5

Mongodb 有多种类型的索引,例如唯一索引、稀疏索引和部分索引。您的案例不仅需要唯一索引,还需要唯一部分索引。尝试创建类似的东西 -

db.<<collectionName>>.createIndex(
{_requester: 1, _requestedBook: 1, status: 1},
{unique: true, partialFilterExpression: { "status" : "opened" }}
)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你...