模型中的索引

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);