首页 > 解决方案 > Mongo 错误:重复键错误没有意义

问题描述

各位开发者好!当我尝试将两个相同的文档保存在与错误中显示的索引无关的 MongoDB 集合中时,我的控制台中出现了此错误。

这是错误: E11000 重复键错误集合:Bohemian.orders 索引:user.email_1 重复键:{ user.email:null }

现在这没有任何意义,因为我试图将 Order 文档保存在单独的集合中,这与我之前设置的用户路由器无关。

这是架构和模型代码:

const mongoose = require('mongoose');

const orderSchema = new mongoose.Schema({
    amountToPay: Number,
});

const Order = mongoose.model("Order", orderSchema);

module.exports.Order = Order;

如此处所示,我只是尝试将要支付的金额保存到单独的集合中的数据库中。

这是路由器文件:

const express = require('express');
const router = express.Router();
const { Order } = require('../models/Order');

router.get("/", async (req, res, next) => {
    try {
        const orders = await Order.find();
        if (orders.length === 0) return res.status(404).send("There are currently no orders");
        res.send(orders);
    } catch (ex) {
        console.error(ex);
        next();
    }
});

router.post("/", async (req, res, next) => {
    try {
        const order = new Order({
            amountToPay: req.body.amountToPay
        });
        await order.save();
        res.send(order);
    } catch (ex) {
        console.error(ex);
        next();
    }
});

module.exports = router;

正如您所看到的,与我收到的错误无关,而且当我没有对 User 模型或路由器进行任何引用时,我不知道为什么会收到重复的 user.email = null key 。

这是我从 POSTMAN 发出的用于测试的 POST 调用: 在此处输入图像描述

非常直截了当,没有极端,没有纠结,对吧?好吧,第一次 POST 调用将文档保存在数据库中,但从那时起我一直收到同样的错误。我唯一能从中得到的是,当我保存第一个文档时,Mongo 在我创建 Order 的新实例时查找 user.email 属性,当它没有找到它时,它会使用 null 值创建它然后下一个文档自然会是重复的,因此会出现错误。但我很困惑,因为这个模型和路由器不应该与用户完全无关。

这是错误:在此处输入图像描述

因此,如果有人能帮助我理解为什么 MongoDB 会惹恼我或者我在哪里犯了错误,我将不胜感激。

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


多亏了 Molda,我发现了问题所在: 在某些时候,我创建了这些索引,我仍然不确定何时以及如何创建这些索引,但我做到了。当我尝试保存第二个文档时,这基本上导致了这个错误。集合中索引的简单快速控制台日志显示我在那里有该索引。

const indexes = await Order.collection.getIndexes();
console.log(indexes);

然后我使用这种方法删除了它们:

await Order.collection.dropIndexes("user.email_1");

从那里开始,一切都完美无缺。我希望这对将来遇到这种情况的任何人有所帮助,并感谢摩尔达!:)


推荐阅读