使用Mongoose向MongoDB插入数组时触发ParallelValidateError错误的求助
解决Mongoose插入数组时的ParallelValidateError问题
嘿,这个问题我之前也碰到过!你遇到的ParallelValidateError是因为一个很容易忽略的小细节——你在defaultItems数组里重复引用了同一个item3文档实例两次。Mongoose在执行insertMany时会并行验证每个文档,而同一个实例不能同时被多次验证,这就触发了这个报错。
问题根源
看你的代码:
const defaultItems = [item1, item3, item3];
这里你把item3这个已经创建好的实例连续加了两次,相当于让Mongoose同时去验证同一个对象两次,这就违反了它的验证规则。
两种解决方案
方案1:为重复任务创建新的文档实例
不要复用同一个实例,而是为相同内容的任务新建一个Items实例:
mongoose.connect("mongodb://localhost:27017/todoList", { useNewUrlParser: true, }); const itemsSchema = mongoose.Schema({ task: String, }); const Items = mongoose.model("item", itemsSchema); const item1 = new Items({ task: "Welcome to your todo-list", }); const item2 = new Items({ task: "Hit the + button to add new task", }); const item3 = new Items({ task: "<-- button to delete the item", }); // 为重复的任务创建新实例,而不是复用item3 const defaultItems = [item1, item2, new Items({ task: "<-- button to delete the item", })]; Items.insertMany(defaultItems, (err) => { if (err) { console.log(err); } else { console.log("Default Items inserted succesfully. "); } });
方案2:直接传入普通对象数组(更推荐)
其实insertMany支持直接传入普通对象数组,Mongoose会自动为每个对象创建独立的文档实例,这样既简洁又能避免重复实例的问题:
mongoose.connect("mongodb://localhost:27017/todoList", { useNewUrlParser: true, }); const itemsSchema = mongoose.Schema({ task: String, }); const Items = mongoose.model("item", itemsSchema); // 直接传普通对象数组,Mongoose内部会处理实例化和验证 const defaultItems = [ { task: "Welcome to your todo-list" }, { task: "Hit the + button to add new task" }, { task: "<-- button to delete the item" } ]; Items.insertMany(defaultItems, (err) => { if (err) { console.log(err); } else { console.log("Default Items inserted succesfully. "); } });
这种方式不仅代码更简洁,还能从根源上避免同一个实例被多次验证的问题,每个对象都会被当作独立的文档处理。
内容的提问来源于stack exchange,提问作者Pranay Prajapati
相关产品推荐
相关产品推荐

