【问题标题】:Saving a document with a sub-document gives duplicate key error保存带有子文档的文档会出现重复键错误
【发布时间】:2022-01-21 19:32:05
【问题描述】:

这是子文档的架构。

const MainProcessSchema=new mongoose.Schema({    
        processID:{type:String,required:true,unique:true},
        processName:{type:String,required:true},
        description:{type:String,required:true},
        subProcess:[
            {
                index:{type:Number},
                subProcessID:{type:mongoose.Schema.Types.ObjectId,ref:'sub-process'},
            }
        ],
        steps:[
            {
                stepNo:{type:String,required:true},
                stepType:{type:String,
                    enum:{
                        values:['image','video'],
                        message:'{VALUE} should be image or video'
                    },
                    required:true}
            }
                
            ]
    })

这是我一直在尝试使用 Equipment.create(req.body) 保存的文档,但在成功保存一个文档后出现 processList.processID:null 的重复键错误。

const EquipmentSchema=new mongoose.Schema<Equipment>({
    Id:{type:String,required:true,unique:true},
    Name:{type:String,required:true}
    Details:{type:String},
    processList:[{type:MainProcessSchema,required:false}]

})

export const Equipment=model<Equipment>('equipment',EquipmentSchema);

我想保存可能包含或不包含 processList 的设备文档,但它不是必需的,除非 processID 已填满。

【问题讨论】:

    标签: node.js mongoose mongoose-schema


    【解决方案1】:

    你必须使用一个不计算空值的自定义索引,在你的情况下使用这个:

     schema.index({ processID: 1 }, { unique: true, partialFilterExpression: { processID: { $type: 'string' } } });
    

    表达式 partialFilterExpression 允许您只计算字符串而不是空值

    【讨论】:

    • 你能帮我在哪里写这个吗?我写过这样MainProcessSchema.index({ processID: 1 }, { unique: true, partialFilterExpression: { processID: { $type: 'string' } } }); 仍然显示为重复键错误
    • sintax 是正确的,您必须手动从数据库中删除旧索引。 (使用像 studio 3t 或类似的程序)。因为如果您保留它,它将继续运行。并且不要忘记从架构中删除 processId 中的唯一 true
    • 你能用一段代码给我解释一下吗,会很有帮助的。谢谢
    • 您在 processId 上设置了一个索引,该索引是唯一的,并且只是一个字符串(空值不会插入此索引,而只会插入字符串值)
    猜你喜欢
    • 2014-08-22
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2019-12-12
    • 2014-01-10
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多