我有一个基本模式和一个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 回答
几天前我遇到了同样的问题 . 我搜索了几个答案,遇到了sparse indexes,可以应用于这个特定的问题 . 但是,由于mongoose现在支持名为partial indexes的东西,它应该优先于稀疏索引:
如果您使用的是Mongoose 4.6.1,则可以直接在该方案上应用索引:
如果您使用的是旧版本,则必须使用本机驱动程序创建索引: