MongoError:包含ObjectId

时间:2018-04-27 01:25:27

标签: mongodb mongoose mongoose-schema

集合索引架构和索引:

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});

该集合已经包含与以下记录相同的fieldmaskvalue的记录,但没有记录包含相同的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_namemaskvalue。所有

都有0记录

任何人都知道为什么重复键为注册时为空?

1 个答案:

答案 0 :(得分:0)

MongoDB将复合键上的ObjectId视为null。找不到关于这个问题的文档,但这是我在MongoDB 3.4.8上测试的结果。

我可能的部分解决方案是在可能使用ObjectID的字段上使用部分索引,或者保存字符串而不是ObjectId对象。

参考: Partial Index