Mongoose Indexing

Mongoose Indexing

本文关键字:Indexing Mongoose      更新时间:2023-09-26

我在Mongoose中的索引有问题。我有一个employeeId字段,它是唯一的。当我创建一个员工文档时,它会创建一个索引"employeeId_1",而且我发现还有一个索引"id"。我想它应该是"_id"。有人能纠正我做错了什么吗?这是代码:

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_"
  }
]

为创建的每个文档自动创建_id字段。您不能更改其名称或将其删除。

employeesSchema将有两个主键:

  • 员工_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