E11000 重复键错误收集:db.products 索引:product_id_1 重复键: product_id:null

Posted

技术标签:

【中文标题】E11000 重复键错误收集:db.products 索引:product_id_1 重复键: product_id:null【英文标题】:E11000 duplicate key error collection: db.products index: product_id_1 dup key: product_id: null E11000 重复键错误收集:db.products 索引:product_id_1 重复键: product_id:null 【发布时间】:2021-10-25 03:27:43 【问题描述】:

请任何人帮助我。 已经两天了,我因为获得所有产品而被阻止 执行 GET 操作时出现重复键错误 我试图在我的 ctrllr 中删除()或 deleteMany()或两者或仅一个我的数据库,但它仍然出现相同的错误...... 我不明白发生了什么

这是我的 product.ctrl

const productCtrl = 
  sendDatasProductToMoongoose: async (req, res) => 
    try 
      await Product.deleteMany()
                    .remove();  
      const createdProducts = await Product.insertMany(data.products);
      console.log('Data Import Sucess createdProducts',createdProducts);
      res.send( createdProducts);
     catch (error) 
      res.status(500).send(error.message)
    
  ,
module.exports = productCtrl;

我的product.Router

const express = require('express');
const productCtrl = require('../controllers/productCtrl');
const productRouter = express.Router();
productRouter.get('/seed', productCtrl.sendDatasProductToMoongoose )
module.exports = productRouter;

我的服务器

require('dotenv').config();
const express = require('express');
const cors = require("cors");


// require connexion db and run it 
const connectDB = require('./config/db');
const app = express();
connectDB();

// fonct. middleware intégrée dans Express :
// Il analyse les req' entrantes avc des charges utiles JSON et est basé sur un analyseur de corps.
// parse les req http en json
app.use(express.json());
app.use(express.urlencoded( extended: true ));
app.use(cors());


app.use('/api/products', require('./routes/productRouter.js'))
app.use('/api/users', require('./routes/userRouter.js'))


//Test
/* app.get('/', (req, res) => 
  res.send('Server is Ready')
) */

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on $PORT`));

我对 Postman 的要求: GET http://localhost:5000/api/products/seed

还有我的错误: E11000 重复键错误收集:dbname.products 索引:product_id_1 重复键: product_id: null

我的文件数据

const bcrypt = require( 'bcryptjs');

const data = 
  users: [
    
      name: 'Nemo',
      email: 'nemo@mail.com',
      password: bcrypt.hashSync('1111', 8),
      isAdmin: true,
    ,
     
      name: 'Dori',
      email: 'dori@mail.com',
      password: bcrypt.hashSync('1111', 8),
      isAdmin: false,
    ,
  ],
  products: [
    
    name:"Pendentif Lunaire en Cristal de Swarovski",
    category: "Pendentif",
    image: '../../frontend/public/images/Moon-pendant.png',
    material:"cristal de Swarovski,  argent 925",
    price: 45,
    countInStock: 3
    ,
    
    name:"Pendentif Labradorite",
    category: "Pendentif",
    image:'../../frontend/public/images/Labradorite-pendant-big.png',
    material:"labradorite,argent 925",
    price: 80,
    countInStock: 2
    ,
     
    name:"Pendentif Labradorite",
    category: "Pendentif",
    image:'../../frontend/public/images/Labradorite-pendant-medium.png',
    material:"labradorite,argent 925",
    price: 45,
    countInStock: 3
    ,
    
    name:"Pendentif Oeil du Tigre",
    category: "Pendentif",
    image:'../../frontend/public/images/EyeTiger-pendant.png',
    material:"labradorite,argent 925",
    price: 45,
    countInStock: 3
    ,
    
    name:"Pendentif en Quartz Rose",
    category: "Pendentif",
    image: '../../frontend/public/images/Quartz-pendant.png',
    material:"améthiste, argent 925",
    price: 35,
    countInStock: 6,
  
  ]


module.exports = data;

【问题讨论】:

**我的产品型号:** 【参考方案1】:

似乎“product_id”是您架构中的唯一索引,对吧?并且您正在尝试插入一个“product_id”为空值的新文档,并且在同一索引中有一个具有此值的现有文档。

当您在唯一索引上插入具有空值的文档时,该值将存储为 null。 (我会把那部分留给文档):

如果文档没有唯一索引字段的值 索引,索引将存储该文档的空值。因为 唯一约束,MongoDB 将只允许一个文档 缺少索引字段。如果有多个文档没有 索引字段的值或缺少索引字段,索引 构建将失败并出现重复键错误。

您可以删除 product_id 为空值的条目,它应该可以工作。

但我强烈建议在插入您的产品之前进行一些验证,以确保它不会再次发生。

【讨论】:

感谢您的帮助。我想我明白了,但我不确定在哪里可以删除该条目,在 productReducer 中?以及关于 productctrl 中的一些验证? 您可以在数据库管理器中手动删除它。你不使用一个吗?您能否编辑您的问题并与我们分享您的产品模型?这样我们就可以检查您的“product_id”索引是如何声明的。 我在 Mongodb Compass 上重置了我的数据库,但刷新后它仍然只有一个产品。 这是我的产品型号:js const mongoose = require('mongoose'); const productSchema = new mongoose.Schema( name: type: String, required: true , image: type: String, required: true , price: type: Number, required: true , material: type: String, required: true , countInStock: type: Number, required: true , , timestamps: true ) const Product = mongoose.model('Product', productSchema); module.exports = Product; 我的prdct.Reducer:const initialStateForGetProducts = products: [] ; export const getProductsReducer = (state = initialStateForGetProducts, action) => switch (action.type) case actionTypes.GET_PRODUCTS_REQUEST: return loading: true, products:[] case actionTypes.GET_PRODUCTS_SUCESS: return loading: false, products: action.payload default: return state;

以上是关于E11000 重复键错误收集:db.products 索引:product_id_1 重复键: product_id:null的主要内容,如果未能解决你的问题,请参考以下文章

E11000 重复键错误收集:ad-network.users 索引:username_1 重复键: : null

使用空数组添加新用户记录时出现“E11000 重复键错误收集”

E11000 重复键错误收集:db.products 索引:product_id_1 重复键: product_id:null

MongoError:E11000 重复键错误集合:annka.transactions 索引:assets_1 重复键::null

MongoError: E11000 重复键错误索引

插入期间:E11000 重复键错误索引