我有以下userSchema
var mongoose = require("mongoose"),
passportLocalMongoose = require("passport-local-mongoose");
var userSchema = new mongoose.Schema({
email: String,
password: String,
userName: String,
fname: String,
lname: String,
userType: Number,
subscribedThreads: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Threads"
}
]
});
// add passport methods
userSchema.plugin(passportLocalMongoose);
// export modules to be used by the file requiring it
module.exports = mongoose.model("Users",userSchema);
收集的第一个条目应该发生,但接下来的条目会给出
{ [MongoError: E11000 duplicate key error collection: KManV3.users
index: username_1 dup key: { : null }]
name: 'MongoError',
message: 'E11000 duplicate key error collection: KManV3.users index:
username_1 dup key: { : null }',
driver: true,
code: 11000,
index: 0,
errmsg: 'E11000 duplicate key error collection: KManV3.users index:
username_1 dup key: { : null }',
getOperation: [Function],
toJSON: [Function],
toString: [Function]
}
此外, dbname.users.getIndexes()给出:
> db.users.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "KManV3.users"
},
{
"v" : 1,
"key" : {
"password" : 1
},
"name" : "password_1",
"ns" : "KManV3.users",
"background" : true
},
{
"v" : 1,
"unique" : true,
"key" : {
"username" : 1
},
"name" : "username_1",
"ns" : "KManV3.users",
"background" : true
}
]
显然,架构的每个属性都设置为唯一,即使数据完全不同,我也无法将数据添加到集合中。我不确定是否归因于护照的整合。
答案 0 :(得分:2)
查看passport-local-mongoose
的{{3}}:
usernameField:指定保存用户名的字段名称。默认为'用户名'。
usernameUnique:指定是否应通过mongodb索引强制使用username字段作为唯一。默认为true。
这解释了为什么您的集合在(不存在于您的架构中)username
字段中具有唯一索引的原因。
如果您没有在添加到数据库的文档中实际设置此字段,MongoDB将使用null
,并在插入第一个文档后,使用后续文档(也包含字段值) null
的{{1}}会抛出E11000错误。
首先,删除username
上的索引(以及username
,我假设您曾在该架构中将该字段标记为password
),并为{设置正确的字段名称{1}}使用:
unique
(或passport-local-mongoose
,如果您希望该字段用作唯一用户标识符)
答案 1 :(得分:0)
错误原因-您试图在其中插入的集合中没有索引。 解决方案-删除该集合,然后再次运行程序。