2012-11-07 8 views
7

Chciałbym zadzwonić pod numer ensureIndex na authorName, jakie jest polecenie i gdzie w tym kodzie powinienem go umieścić?using ensureIndex w schemacie mongody za pomocą mangusty

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

Odpowiedz

21

Nie mów ensureIndex bezpośrednio, można wskazać, że pole powinno być indeksowane w schemacie tak:

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

Na podstawie tej definicji, Mongoose wezwie ensureIndex dla Ciebie po zarejestrowaniu model poprzez wywołanie mongoose.model.

Aby zobaczyć ensureIndex połączenia, które Mongoose sprawia, umożliwiają wyjście debugowania przez dodanie następujących do kodu:

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

czy posiadanie wielu indeksów będzie dobrą rzeczą, czy może spowolni działanie? Rozumiem, że pojedynczy indeks w usłudze ma mieć wartość O (log n) – bouncingHippo

+0

@bouncingHippo Należy utworzyć tylko indeksy, które rzeczywiście są potrzebne do obsługi żądanej wydajności kwerendy. Każdy indeks dodaje pracę podczas dodawania/edytowania dokumentów i zajmuje miejsce na dysku i pamięci. – JohnnyHK

+1

Edytowałem pytanie, czy mógłbyś trochę rzucić okiem na moją próbę znalezienia wszystkich komentarzy przez konkretnego użytkownika? dzięki!! – bouncingHippo

11

Można korzystać z tej klauzuli:

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

Na przykład chcesz wykonaj kilka testów integracyjnych, więc będziesz musiał szybko usunąć swoje kolekcje. W takim przypadku mangusta nie ustawia indeksów ponownie podczas wykonywania, nawet jeśli opcja autoIndex jest ustawiona na true. Ta odpowiedź może być przydatna w takim przypadku.

1

Najpierw zdefiniuj indeks w polu authorName, a jeśli chcesz ręcznie wywołać metodę sureIndex z powodu pewnych wymagań, musisz ustawić autoindeks na na wartość false. To jest to, co schemat wyglądałby następująco:

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

I na podstawie wymogu można wywołać metodę ensureIndexes od modelu, które zostały utworzone za pomocą tego schematu tj ProjectModel.ensureIndexes();

2

można nazwać Schema metoda Wskaźnik stworzyć indeks

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

można słuchać createing wydarzeniu.

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

Uwaga: proces tworzenia indeksu jest asynchronous.so podczas tworzenia indeks unikatowy, nie można wstawić zduplikowanych danych. lub tworzenie indeksu zawiedzie;

Powiązane problemy