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

时间:2017-03-19 07:13:51

标签: node.js mongodb mongoose 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
  }
});

我的数据库应该只有一个打开请求供任何人使用 所以我添加了一个像这样的唯一索引 -

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请求。

我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

Mongodb有许多类型的索引,如唯一索引,稀疏索引和部分索引。您的案例不仅需要唯一索引,它还需要unique partial index。 尝试创建类似 -

的内容
gte

希望它有所帮助...