如何指定字段是对象数组,数组对象在Mongoose中具有唯一但可选的属性之一?

时间:2018-12-28 11:03:05

标签: mongodb mongoose mongoose-schema

这是我的员工个人信息架构

const mongoose = require('mongoose');
const PersonalInformationSchema = mongoose.Schema({
name: {
        type: String,
        required: true
    },
emails: [{
        email: {
            type: String,
            trim: true,
            unique: true
        },
        isPrimary: {
            type: Boolean
        }
    }]
}, {
    timestamps: true
});
module.exports = mongoose.model('PersonalInformation', PersonalInformationSchema);

在我的情况下,我有emails数组,它对于雇员是可选的,但应该是唯一的。当我插入没有电子邮件的记录时,文档成功保存(使用空数组emails: []),但是在下一次尝试中会显示

"err": {
        "driver": true,
        "name": "MongoError",
        "index": 0,
        "code": 11000,
        "errmsg": "E11000 duplicate key error collection: EmployeePersonalInformation.personalinformations index: emails.email_1 dup key: { : null }"
}

1 个答案:

答案 0 :(得分:2)

您可以将sparse: true添加到架构中,请尝试:

const PersonalInformationSchema = mongoose.Schema({
    name: {
            type: String,
            required: true
        },
    emails: [{
            email: {
                type: String,
                trim: true,
                unique: true, 
                sparse: true
            },
            isPrimary: {
                type: Boolean
            }
        }]
    }, {
        timestamps: true
});
  

索引的稀疏属性可确保索引仅包含具有索引字段的文档的条目。索引会跳过没有索引字段的文档。

因此,当跳过空文档时,您不会因unique约束而出错。