模型中的索引
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);