模型中的索引

MongoDB 支持二级索引。在 Mongoose 中,我们在模式中定义这些索引。当我们需要创建复合索引时,必须在模式级别定义索引。

Mongoose 连接

var strConnection = 'mongodb://localhost:27017/dbName';
var db = mongoose.createConnection(strConnection)

创建基本架构

var Schema = require('mongoose').Schema;
var usersSchema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    created: {
        type: Date,
        default: Date.now
    }
});

var usersModel = db.model('users', usersSchema);
module.exports = usersModel;

默认情况下,mongoose 会在模型中添加两​​个新字段,即使这些字段未在模型中定义。这些领域是:

_ID

如果未将一个模式传递给模式构造函数,默认情况下,默认情况下会为每个模式分配一个_id 字段。分配的类型是 ObjectId,以与 MongoDB 的默认行为一致。如果你根本不想在模式中添加_id,可以使用此选项将其禁用。

var usersSchema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true
    }, {
        _id: false 
});

__v 或 versionKey

versionKey 是 Mongoose 首次创建时在每个文档上设置的属性。此键值包含文档的内部修订版。此文档属性的名称是可配置的。

你可以在模型配置中轻松禁用此字段:

var usersSchema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true
    }, {
    versionKey: false 
});

复合指数

我们可以创建除 Mongoose 创建的其他索引。

usersSchema.index({username: 1 });
usersSchema.index({email: 1 });

在这些情况下,我们的模型还有两个索引,一个用于字段用户名,另一个用于电子邮件字段。但我们可以创建复合索引。

usersSchema.index({username: 1, email: 1 });

指数表现影响

默认情况下,mongoose 始终按顺序为每个索引调用 ensureIndex,并在所有 ensureIndex 调用成功或出现错误时在模型上发出’index’事件。

在 MongoDB 中,ensureIndex 自 3.0.0 版本起不推荐使用,现在是 createIndex 的别名。

建议通过将模式的 autoIndex 选项设置为 false 来禁用该行为,或者通过将选项 config.autoIndex 设置为 false 来全局连接。

usersSchema.set('autoIndex', false);