【问题标题】:Duplicated key error after the first create with discriminator in mongoose在猫鼬中第一次使用鉴别器创建后重复键错误
【发布时间】:2018-07-19 12:31:01
【问题描述】:

我在猫鼬中有一个基本模式和一个派生模式。如果我从一个新的数据库开始并创建第一个基本文档,那么一切都很好。然而,第二次创建永远不会成功并出现警告代码:

(node:7584) UnhandledPromiseRejectionWarning: UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 1): BulkWriteError: E11000 duplicate key error collection: 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;

派生的.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;

更新

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    几天前我遇到了同样的问题。我搜索了一些答案,发现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' }
        }
      });
    

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 2022-01-26
      • 2014-07-10
      • 2017-09-24
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2014-12-04
      • 2018-03-25
      相关资源
      最近更新 更多