MongoError:E11000 重复键错误集合:workflow.compnies 索引:username_1 dup key: username:null

Posted

技术标签:

【中文标题】MongoError:E11000 重复键错误集合:workflow.compnies 索引:username_1 dup key: username:null【英文标题】:MongoError: E11000 duplicate key error collection: workflow.compnies index: username_1 dup key: username: null MongoError:E11000 重复键错误集合:workflow.compnies 索引:username_1 dup key: username:null 【发布时间】:2021-10-01 23:35:15 【问题描述】:

这类问题已经问过很多次了。我已经尝试了每一个答案。在大多数情况下,答案就像删除由 mongo 自动创建的用户索引。我做了太多次了。但是每次我在服务器上发出请求时,它都会再次创建(索引)。 当我写db.compnies.getIndexes().我得到

[
        
                "v" : 2,
                "key" : 
                        "_id" : 1
                ,
                "name" : "_id_"
        ,
        
                "v" : 2,
                "unique" : true,
                "key" : 
                        "username" : 1
                ,
                "name" : "username_1",
                "background" : true
        
]

db.compnies.dropIndexes("username":1)删除后。我明白了 [ "v" : 2, "key" : "_id" : 1 , "name" : "_id_" ] 作为db.compnies.getIndexes()

在重复上述过程的每个新请求后。自过去两天以来我一直面临此错误。我无法提交我的数据。 请帮我。 谢谢。

这是我的用户模型:

const mongoose = require("mongoose");
const passportLocalMongoose = require("passport-local-mongoose");
// const findOrCreate = require('mongoose-findorcreate');

const logoSchema=new mongoose.Schema(
    url:String,
    filename:String
);
const UserSchema = new mongoose.Schema(
    email: 
        type: String,
    ,
       username:
        type:String,
        unique:false
     ,
    // password:
    //     type:String,
    // ,
 googleId : 
        type : String, 
     , 
 name : 
     type : String,
     ,
 firstName : 
     type : String,
  ,
 lastName : 
     type : String,
 ,
 age:
     type:String
 ,
 compny:
     type:String
 ,
//   logo :[logoSchema],

logo: 
    type: String,
    required: [true, "Uploaded file must have a name"],
  ,

 createdAt:
   type: Date,
   default : Date.now
     
);
UserSchema.plugin(passportLocalMongoose);
//  UserSchema.plugin(findOrCreate);

const User = mongoose.model('User', UserSchema);
module.exports = User;

这是我的公司模型:

const mongoose=require("mongoose");
const passportLocalMongoose = require("passport-local-mongoose");

// const ImageSchema = new mongoose.Schema(
//     url: String,
//     filename: String
// );

const compnySchema= new mongoose.Schema(
    name:
        type:String,
        // required:true
    ,
    location:
        type:String,
        // required:true
    ,
    category:
        type:String,
        // required:true
    ,
    about:
        type:String
    ,
      logo: 
        type: String,
        required: [true, "Uploaded file must have a name"],
      ,
      count:
          type:Number
      
);
compnySchema.plugin(passportLocalMongoose);
const Compny= mongoose.model("Compny", compnySchema);
module.exports=Compny;

【问题讨论】:

您的问题不清楚。您是在问“为什么我会收到重复的密钥错误?”或者您是在问“为什么这个过程会创建一个对字段 'username' 具有唯一约束的索引?” 我想回答这两个问题。谢谢。 【参考方案1】:

我能够重现您的情况。我重新创建了一个节点程序...

// npm install mongoose
// npm install passport-local-mongoose


var mongoose = require('mongoose');
const passportLocalMongoose = require("passport-local-mongoose");

mongoose.connect("mongodb://localhost:27017/nodetest", useNewUrlParser: true, useUnifiedTopology: true);

var db = mongoose.connection;

//Bind connection to error event (to get notification of connection errors)
db.on('error', console.error.bind(console, 'MongoDB connection error:'));

const compnySchema= new mongoose.Schema(
    name:
        type:String,
        // required:true
    ,
    location:
        type:String,
        // required:true
    ,
    category:
        type:String,
        // required:true
    ,
    about:
        type:String
    ,
      logo: 
        type: String,
        required: [true, "Uploaded file must have a name"],
      ,
      count:
          type:Number
      
);

compnySchema.plugin(passportLocalMongoose);
const Compny= mongoose.model("Compny", compnySchema);
module.exports=Compny;
let compny = new Compny;

compny.name = "some company";
compny.logo = "some logo";

compny.save(function(err) 
    console.log(err);
);

如果我运行这个程序两次,我会得到一个重复键异常。这是因为护照。程序护照在字段username 上强制执行唯一索引。但是您没有名为username 的字段。这意味着第一条记录将被添加到文档中字段username 的空值(缺失)。插入的第二个文档还具有字段 username 的空值(缺失),因此违反了唯一性约束。

如果架构护照中不存在字段username,将自动添加唯一索引。但是,如果该字段确实存在于架构中,它将不会为该字段添加索引 - 唯一或不唯一。如果字段username 存在,我想它期望包含唯一属性的索引的完整定义应用于架构定义。

建议

不要不要将护照申请到公司收藏 不要在用户收藏中使用护照。

【讨论】:

非常感谢,现在很清楚了。在错误解决期间,当我在 compnyschema 中添加具有唯一真实属性的用户名字段时,它对我有用,但现在我得到了答案,为什么它在其他模式中工作以及护照的作用。

以上是关于MongoError:E11000 重复键错误集合:workflow.compnies 索引:username_1 dup key: username:null的主要内容,如果未能解决你的问题,请参考以下文章

我该如何修复(节点:14352)UnhandledPromiseRejectionWarning:MongoError:E11000 重复键错误集合:错误?

Node.js MongoError: E11000 重复键错误集合:

MongoError:E11000 重复键错误集合:workflow.compnies 索引:username_1 dup key: username:null

MongoError: E11000 重复键错误索引

MongoError,err:E11000 重复键错误

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