2013-12-14 3 views
1

У меня проблемы с индексированием в Mongoose. У меня есть поле employeeId, которое уникально. Когда я создаю документ сотрудника, он создает индекс «employeeId_1», а также обнаруживаю, что есть индекс «id». Я бы предположил, что это должно быть «_id». Может ли кто-то пройтись над тем, что я делаю неправильно? Вот код:Mongoose Indexing

var mongoose = require('mongoose'); 
var ObjectId = mongoose.SchemaTypes.ObjectId; 

var eContactSchema = mongoose.Schema({ 
    contacttype:{type: Number}, 
    name:{type: String, required:true}, 
    phone:{type: String, trim: true}, 
    mail1:{type: String, trim: true}, 
    mail2:{type: String, trim: true}, 
    city:{type: String, trim: true}, 
    state:{type: String, trim: true}, 
    zip:{type: String, trim: true} 
}) 

var eCourseSchema = mongoose.Schema({ 
    course:{type: ObjectId, required:true, unique: true}, 
    title:{type: String}, 
    notes:{type: String, trim:true}, 
    expire:{type: Date}, 
    deleted: {type: Boolean, default: false} 
}) 

var eAppSchema = mongoose.Schema({ 
    appName:{type: String, required: true, trim: true}, 
    view:{type: Boolean, default: false}, 
    create:{type: Boolean,default: false}, 
    edit:{type: Boolean,default: false}, 
    del:{type: Boolean,default: false} 
}) 

var employeesSchema = mongoose.Schema({ 
    firstName:{type: String, trim:true, required:true}, 
    lastName:{type: String, trim:true, required:true}, 
    employeeId: {type: String, trim:true, required:true, unique: true}, 
    active: {type: Boolean, default: true}, 
    admin: {type: Boolean, default: false}, 
    title: {type: String, trim:true}, 
    pin:{type:String, trim: true}, 
    contacts:[eContactSchema], 
    courses:[eCourseSchema], 
    apps:[eAppSchema] 
}) 

module.exports = db.model('employees', employeesSchema,'employees');  

Вот как я создаю документ.

 exports.addEmployee = function (data, callback) { 
    employees.create(data, function (err) { callback(err) }); 
}; 

Это результаты getIndex. По какой-то причине я не могу воссоздать проблему, но вместе с этим будет еще один индекс с именем employeeId_1. Это приведет к дублированию ошибки в ключе employeeId_1.

[ 
    { 
    "v": 1, 
    "key": { 
     "_id":1 
    }, 
    "ns": "Management.employees", 
    "name": "_id_" 
    } 
] 
+1

я не уверен, что вы просите. Можете ли вы изменить свой вопрос, чтобы включить вывод 'db.employees.getIndexes() из оболочки и что вы считаете неправильным? – JohnnyHK

ответ

0

Поле _id создается автоматически для каждого созданного документа. You не может изменить свое название или удалить его.

employeesSchema будет имеет 2 первичных ключей:

  • employee._id
  • employee.employeeId

именно поэтому вы видите два индекса в вашем мангуста


Редактировать:

После создания модели, мы должны ждать, пока индекс события, прежде чем создать документ

User = mongoose.model('users', UserSchema); 

User.on('index', function() { 
    new User({}).save(); 
    new User({}).save(); 
    new User({}).save(); 
    new User({}).save(); 
}) 

Если вы не ждать, пока индекс события, индекс не может быть создан (и вы не увидите предупреждение от мангуста об этом)

у меня есть отчет, чтобы это мангуст и получить ответ на этом вопросе: https://github.com/LearnBoost/mongoose/issues/1745

+0

Теперь я даже не получаю второй индекс employeeId –

+0

ответ обновлен! – damphat

+0

if on ('index') - ваша проблема, вы можете сделать 2 файла, install.js для создания моделей db и app.js для добавления документов, а затем запускаться отдельно в терминале. – damphat