我有一个基本架构和一个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,这就是它重复的原因。但是,我希望名称是唯一的,但只有它的派生文档。怎么办呢?
答案 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' }
}
});