如何在猫鼬模式中定义唯一字段?

时间:2021-06-30 10:20:12

标签: mongodb mongoose nosql schema unique-values

我的架构如下:

const schema = new mongoose.Schema({
    a: {
        b: { type: String, unique: true },
        c: { type: String }
    },
    aa: {
        bb: [{
            cc: { type: String, unique: true },
            dd: { type: String }
        }]
    }
})

现在我想让 'b' 和 'cc' 字段是唯一的。 我该怎么做?

我在顶部代码的末尾添加了此代码,但架构允许重复值。

schema.index({'a.b':1}, {unique:true})
schema.index({'aa.bb.cc':1, {unique:true})

你有解决这个问题的想法吗?

1 个答案:

答案 0 :(得分:1)

这里的答案完全取决于您所说的“我希望 'b' 和 'cc' 字段是唯一的。”

Mongoose 通过使用 unique:true 选项在该字段上创建 MongoDB 索引来实现唯一约束。

MongoDB 通过不允许相同的值在索引中存储两次来强制执行唯一选项。

当文档被写入 MongoDB 时,它从文档中提取索引所需的字段值,对列表进行去重,然后将这些值与指向文档的指针一起存储在索引中。

这意味着只有 1 个文档可能包含特定值,但该文档可能多次包含该值。

例如:

如果 {i:1} 上有索引,这些示例文档在索引中将包含以下条目:

<头>
文档 索引条目
{i:1} 1=>
{i:[2,3,4] 2=>
3=>
4=>
{i:[5,6,5,6,5]} 5=>
6=>
{i:[2,6]} 2=>
6=>

如果索引是唯一的,并且文档完全按照该顺序插入,则前 3 个文档将完全可以接受,而最后一个将导致重复键错误。