использование ensureIndex в схеме mongodb с использованием мангуста

Я хотел бы назвать ensureIndex на authorName, какая команда и где в этом коде я должен поставить его?

var mongoose = require('mongoose');

// defines the database schema for this object
var schema = mongoose.Schema({
    projectName : String,
    authorName : String,
    comment : [{
        id : String,                                    
        authorName : String,
        authorEmailAddress : { type : String, index : true }    
    }]
});

// Sets the schema for model
var ProjectModel = mongoose.model('Project', schema);

// Create a project
exports.create = function (projectJSON) {
    var project = new ProjectModel({
        projectName : projectJSON.projectName,
        authorName : projectJSON.authorName,    

        comment : [{
            id : projectJSON.comments.id,                                           
            authorName : projectJSON.comments.authorName,                           
            authorEmailAddress : projectJSON.authorEmailAddress
        });

        project.save(function(err) {
            if (err) {
                console.log(err);
            } else{
                console.log("success");
            }
        });
    });
}

4 ответов


ты не звонишь ensureIndex непосредственно вы указываете, что поле должно быть индексировано в вашей схеме следующим образом:

var schema = mongoose.Schema({
  projectName : String,
  authorName : { type: String, index: true }
});

основываясь на этом определении, Мангуст вызовет ensureIndex для вас, когда вы регистрируетесь модель через mongoose.model звонок.

посмотреть ensureIndex вызовы, которые делает Мангуст, включите отладочный вывод, добавив в свой код следующее:

mongoose.set('debug', true);

вы можете использовать это утверждение:

mongoose.connection.collections['my_collection'].ensureIndex({ "key": 1 }, { "unique": true }, callback);

например, вы хотите сделать некоторые интеграционные тесты, поэтому вам нужно будет быстро удалить свои коллекции. В этом случае мангуст не устанавливает индексы снова во время выполнения, даже если option autoIndex установлено значение true. В таком случае этот ответ может оказаться полезным.


Вы можете вызвать метод Schema#index для создания index

let urlSchema = new Schema({
    url: String,
    status: Number
  }
);
urlSchema.index({ url: 1 }, { unique: true, background: true, dropDups: true });

вы можете прослушать событие createing index.

let UrlModel = mongoose.model('url', urlSchema);
UrlModel.on('index', function(error) {
  if (error && error.message) {
    console.log(`Url collection create index error:${error.message}`);
  }
});

Примечание: процесс создания индекса является асинхронным.поэтому при создании уникального индекса невозможно вставить дубликаты данных. или создание индекса завершится неудачей;


сначала определите индекс в поле authorName, и если вы вручную хотите вызвать ensureIndex из-за определенного требования, то вам нужно установить появилась в false. Вот как будет выглядеть ваша схема:

var schema = mongoose.Schema({
    projectName : String,
    authorName : {type : String, index : true}
    comment : [{
        id : String,                                    
        authorName : String,
        authorEmailAddress : { type : String, index : true }    
    }]
}, {
     // Turn-off auto indexing, we manually need to trigger indexing 
     autoIndex : false 
});

и на основе требования вы можете вызвать метод ensureIndexes на модели, созданной с помощью этой схемы, т. е. ProjectModel.ensureIndexes ();