Mongo为具有unique:false的字段提供dup key错误

时间:2015-05-25 20:54:27

标签: javascript node.js mongodb mean-stack

更新:感谢JohnnyHK的回答,我的问题已经解决了!

初步问题:为什么我收到以下错误消息的任何想法?请注意,即使程序正常运行,“我们已连接”行之前的所有内容都会打印出来。

DEBUG=cfcwebportal:* ./bin/www
[Error: /home/ben/Code For Chicago/cfcwebportal/node_modules
/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/node_modules/bson-ext/build/Release/bson.node: invalid ELF header]
js-bson: Failed to load c++ bson extension, using pure JS version
[Error: /home/ben/Code For Chicago/cfcwebportal/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/node_modules/bson-ext/build/Release/bson.node: invalid ELF header]
js-bson: Failed to load c++ bson extension, using pure JS version
[Error: /home/ben/Code For Chicago/cfcwebportal/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/node_modules/bson-ext/build/Release/bson.node: invalid ELF header]
js-bson: Failed to load c++ bson extension, using pure JS version
[Error: /home/ben/Code For Chicago/cfcwebportal/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson/node_modules/bson-ext/build/Release/bson.node: invalid ELF header]
js-bson: Failed to load c++ bson extension, using pure JS version
We are connected
meBob
{ [MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index: cfc.students.$fname_1  dup key: { : "meBob" }]
  name: 'MongoError',
  message: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: cfc.students.$fname_1  dup key: { : "meBob" }',
  index: 0,
  code: 11000,
  errmsg: 'insertDocument :: caused by :: 11000 E11000 duplicate key error index: cfc.students.$fname_1  dup key: { : "meBob" }' }
We found students

这是我们尝试运行的文件。当每个字段都是唯一的时它可以正常工作,但是当任何字段不唯一时它都不能正常工作,即使除了“uname”之外的所有字段都将“unique”字段设置为“false”

var express = require('express');
var router = express.Router();
var jsSHA = require("jssha"); // see https://github.com/Caligatio/jsSHA
//Checking if mongoose is npm installed
//Requires nmp install mongodb as well
var mongoose = require('mongoose');
//Using database "cfc"; if not creted will create for first time
mongoose.connect('mongodb://localhost/cfc')
var db = mongoose.connection;

function validatePresenceOf (value) {
    if(typeof value === 'string' || typeof value === 'number') {
        value = value.toString().trim();
    }
    return !!(value && value.length);
}

//In case not connected

db.on('error', console.error.bind(console, 'connection error: '));

db.once('open', function(callback) {

    //All prints are for debugging
    //Furthermore, we do not know what needs to be inside of db.once and what could be outside of db.once.
    console.log("We are connected");

    //Creating Schema
    var studentSchema = mongoose.Schema({
        uname: {
              type: String
            , required: true
            , unique: true
            , validate: [validatePresenceOf, 'Username is empty']
            },
        password: {
              type: String
            , required: true
            , unique: false
            , validate: [validatePresenceOf, 'Password is empty']
            },
        fname: {
              type: String
            , required: true
            , unique: false
            , validate: [validatePresenceOf, 'First name is empty']
            },
        lname: {
              type: String
            , required: true
            , unique: false
            , validate: [validatePresenceOf, 'Last name is empty']
            },
        organization: {
              type: String
            , required: true
            , unique: false
            , validate: [validatePresenceOf, 'Organization is empty']
            }
    });

    //Using the schema Student to create model
    var Student = mongoose.model('Student', studentSchema);

    // Creating the student Bob
    var bob = new Student({ uname: 'Sir Bob', password: 'mypass', fname: 'meBob', lname: 's', organization: 'moredeath' });
    console.log(bob.fname);

    //Saving the Student Bob
    bob.save(function (err, bob) {
        if (err) return console.log(err);
        console.log("We saved BOB");
    });

    //Finding all students
    var k = Student.find(function (err, students){
        if (err) return console.log("We did not find anything");
        console.log("We found students");
    });
    //console.log(k);
});

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

这是我目前的数据库:

> db.students.find()
{ "_id" : ObjectId("55637c8f00a648751180f0b1"), "uname" : "UBob", "password" : "AyBob", "fname" : "Bob", "lname" : "Robertson", "organization" : "CFC", "__v" : 0 }
{ "_id" : ObjectId("5563847fadcdb986135440e0"), "uname" : "death", "password" : "death", "fname" : "death", "lname" : "death", "organization" : "death", "__v" : 0 }
{ "_id" : ObjectId("556386ab95a85003141b4733"), "uname" : "Ben", "password" : "mypass", "fname" : "meBob", "lname" : "s", "organization" : "moredeath", "__v" : 0 }

1 个答案:

答案 0 :(得分:5)

Mongoose不会根据当前架构删除或重新定义以前创建的索引,所以我假设您之前在fname上有一个唯一索引。手动将其放入shell中,然后重新启动应用程序:

db.students.dropIndex('fname_1')