集合索引模式和索引:
const schema: Mongoose.SchemaDefinition = {
field_name: { type: String, required: true },
mask: { type: String, required: true },
value: { type: String, required: true },
register: { type: Mongoose.Schema.Types.ObjectId, ref: 'register' }
};
const indexFields = {
field_name: 1,
mask: 1,
regsiter: 1,
value: 1
};
export const RegisterFieldsSchema = new Mongoose
.Schema(schema, { timestamps: true })
.index(indexFields, {unique: true});
和该集合已经具有与以下记录相同的field
,mask
和value
的记录,但是没有记录包含相同的register
。
当我尝试插入文档时:
db.getCollection('registerfields')
.insert({
"field_name":"ARM_SMMU_CBn_PMEVTYPER2_0_NSU",
"mask":"0x10000000",
"register":ObjectId("5ae2639ffc61a6c8dbb332a5"),
"value":"0x00000000",
});
数据库返回:
grdb-dev.registerfields index:
field_name_1_mask_1_regsiter_1_value_1 dup key:
{
: "ARM_SMMU_CBn_PMEVTYPER2_0_NSU",
: "0x10000000",
: null,
: "0x00000000"
}
根据其他几个答案,这可能是由于集合中已经存在的没有register
属性的文档引起的。所以我检查了是否是这种情况:
db.getCollection('registerfields')
.find({"register": {$exists: false}})
结果:Fetched 0 record(s) in 6ms
我还运行上述查询,以检查所有文档是否包含field_name
,mask
和value
。获得了所有
有人知道为什么重复的键为寄存器null?
mongoDB在化合物键上将ObjectId
视为null。找不到有关此问题的文档,但这是我在MongoDB 3.4.8的测试的结果。
i可能的部分解决方案是使用可能使用ObjectID
或保存字符串而不是ObjectId
对象的字段上的部分索引。
参考:部分索引