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

时间:2018-02-08 20:08:47

标签: node.js mongodb mongoose

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

  

(node:7584)UnhandledPromiseRejectionWarning:未处理的promise 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;

更新

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

1 个答案:

答案 0 :(得分: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' }
    }
  });