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)
希望能帮助到你...
| 归档时间: |
|
| 查看次数: |
1122 次 |
| 最近记录: |