2012-11-07 22 views
7

Vorrei chiamare ensureIndex su authorName, qual è il comando e dove in questo codice dovrei inserirlo?utilizzando ensureIndex nello schema mongodb utilizzando mangusta

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

risposta

21

Non si chiama ensureIndex direttamente, si indica che campo deve essere indicizzato nello schema come questo:

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

In base a tale definizione, Mongoose chiamerà ensureIndex per voi quando si registra il modello tramite la chiamata mongoose.model.

Per vedere le ensureIndex chiamate che Mangusta sta facendo, abilitare l'output di debug aggiungendo il seguente al codice:

mongoose.set('debug', true); 
+0

avrà molti indici essere una buona cosa, o rallenterà le prestazioni? Capisco che un singolo indice su una proprietà è inteso per avere O (log n) – bouncingHippo

+0

@bouncingHippo. Si desidera solo creare gli indici effettivamente necessari per supportare le prestazioni delle query richieste. Ogni indice aggiunge lavoro quando si aggiungono/edutano documenti e occupano il disco e la memoria. – JohnnyHK

+1

ho modificato la domanda un po 'ti dispiacerebbe dare un'occhiata al mio tentativo di trovare tutti i commenti da un utente specifico? Grazie!! – bouncingHippo

11

Si potrebbe usare questa dichiarazione:

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

Per esempio si desidera eseguire alcuni test di integrazione, quindi sarà necessario eliminare rapidamente le raccolte. In questo caso, la mangusta non imposta nuovamente gli indici durante il runtime anche se l'opzione autoIndex è impostata su true. Questa risposta potrebbe essere utile in tal caso.

1

Prima definizione dell'indice sul campo authorName e se si desidera manualmente invocare ensureIndex a causa di determinati requisiti, è necessario impostare autoIndex su falso. Questo è ciò che lo schema sarà simile:

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

E sulla base dei requisiti è possibile richiamare il metodo ensureIndexes sul modello che si è creato utilizzando questo schema vale a dire ProjectModel.ensureIndexes();

2

è possibile chiamare il metodo dello schema # indice per creare l'indice

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

è possibile ascoltare createing evento indice.

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

Nota: il processo di creazione dell'indice è asynchronous.so quando si crea indice univoco, non è possibile inserire i dati duplicati. o la creazione dell'indice fallirà;

Problemi correlati