在mongoose Schema中定义一个唯一的数字数组

4

我想在Node的mongoose中存储一堆数组。我希望确保这些数组包含唯一的数字集合。以下是我的模式:

var schema = new Schema({
    array: { type: [Number], unique: true, required: true }
});

它不起作用。例如,创建和保存一对具有几个(我称之为独特的)数组的新数据库模型:

new Model({ array: [1,2] })
new Model({ array: [0,2] })

...引起了这个问题:

E11000 duplicate key error index: test2.modes.$array_1  dup key: { : 1 }

看起来“unique”正在检查这些数组中的每个索引是否唯一,而不是整个数组是否唯一。

有没有其他方法可以一步完成这个操作?或者我必须在db中执行一个查找,例如在schema.pre('save',fn)中,以检查这些数组是否唯一?


看起来不是。请参考 https://dev59.com/Jmw15IYBdhLWcg3wO5SX 可能是重复的问题。 - JohnnyHK
是的,我看到那个问题了。再看一遍,我猜它可能在谈论同样的事情,但是对子文档(小猫)的引用让我感到困惑。MongoDB新手。 - stephband
似乎这是同一问题的复合变体。根据您的整体用例,使用$addToSet运算符更新数组可能对您有所帮助。 - JohnnyHK
数组本身将被固定 - 一旦生成,它们就不会改变。 - stephband
1个回答

4

好的,既然没有更好的方法,我就用一个保存钩子和额外的字符串来解决它:

var schema = new Schema({
    array: { type: [Number], required: true }
    _arraySignature: { type: String, unique: true }
});

schema.pre('save', function(next) {
    this._arraySignature = this.array.join('.');
    next();
});

...但是我之所以能够这样做,是因为我知道我的数组将会被排序,不会包含重复的数字,并且是不可变的。这有点丑陋。如果有更好的方法,我会很高兴知道。


我很想知道是否有更好的方法。 - Alexander Mills
您可以添加一个验证器 https://mongoosejs.com/docs/validation.html - OneCricketeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接