首页 文章

第一次使用mongoose中的鉴别器创建后出现重复的键错误

提问于
浏览
0

我有一个基本模式和一个mongoose派生的模式 . 如果我从一个新的数据库开始,我创建了第一个基础文档,一切正常 . 但是第二次创建永远不会成功使用警告代码:

(node:7584)UnhandledPromiseRejectionWarning:未处理的promise拒绝(拒绝ID:1):BulkWriteError:E11000重复键错误集合:somedb.base index:name_1 dup key:{:null}

尽管如此,我可以创建任意数量的衍生文档 . 如果我删除了鉴别器部分,并存储基础并派生在不同的集合中,一切都还可以 . 所以我认为我继承模型的方式有问题 .

base.js

var db = require('../config/db');

var Schema = db.Schema;

var baseSchema = new Schema({
    lat: {
        type: Schema.Types.Number,
        required: true
    },
    lon: {
        type: Schema.Types.Number,
        required: true
    }
}, {discriminatorKey: 'kind'})

var Base = db.model('base', baseSchema);

module.exports = Base;

derived.js

var db = require('../config/db');

var Schema = db.Schema;

var derivedSchema = new Schema({
    name: {
        type: Schema.Types.String,
        required: true,
        unique: true
    },
    type: {
        type: Schema.Types.ObjectId,
        ref: 'base',
        required: true
    }
}, {discriminatorKey: 'kind'})

var Base = db.model("base");

var Derived = Base.discriminator('derived', derivedSchema);

module.exports = Derived;

Update

重复键错误是因为在派生模型中,名称是唯一的 . 当我插入基础文档时,名称始终为null,这就是它重复的原因 . 但是,我希望名称是唯一的,但只有它的派生文档 . 怎么做到呢?

1 回答

  • 0

    几天前我遇到了同样的问题 . 我搜索了几个答案,遇到了sparse indexes,可以应用于这个特定的问题 . 但是,由于mongoose现在支持名为partial indexes的东西,它应该优先于稀疏索引:

    在3.2版中更改:从MongoDB 3.2开始,MongoDB提供了创建部分索引的选项 . 部分索引提供了稀疏索引功能的超集 . 如果您使用的是MongoDB 3.2或更高版本,则部分索引应优先于稀疏索引 .

    如果您使用的是Mongoose 4.6.1,则可以直接在该方案上应用索引:

    baseSchema.index({name: 1}, {unique: true, partialFilterExpression: {kind: {$eq: 'derived'}}});
    

    如果您使用的是旧版本,则必须使用本机驱动程序创建索引:

    db.collection('baseSchema').createIndex({ name: 1 }, {
        unique: true,
        partialFilterExpression: {
          kind: { $eq: 'derived' }
        }
      });
    

相关问题