2012-11-07 8 views
7

authorName numaralı telefona ensureIndex numaralı telefonu aramak istiyorum, komut nedir ve bu kodda nereye koymalıyım?mongoose kullanarak mongodb şemasında warrantyIndex kullanarak

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

cevap

21

doğrudan ensureIndex demiyorlar, söz konusu alan bu gibi şemada dizine eklenmesi gerektiğini gösterir: Kayıt olurken bu tanıma dayanarak

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

, Gelincik sizin için ensureIndex arayacak mongoose.model numaralı telefondan arayın. Örneğin

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

istediğiniz için: Bu ifadeyi kullanabilirsiniz

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

Çok sayıda dizin olması iyi bir şey mi olacak, yoksa performansı yavaşlatacak mı? Bir özelliğe sahip tek bir dizinin, O (log n) – bouncingHippo

+0

@bouncingHippo olması gerektiği anlamına gelir. Yalnızca gereksinim duyduğunuz sorgulama performansını desteklemek için gereksinim duyduğunuz dizinleri oluşturmak istiyorsunuz. Her dizin, belgeleri eklerken/düzenlerken işe yarar ve disk ve bellek alırlar. – JohnnyHK

+1

Soruyu, belirli bir kullanıcı tarafından yapılan tüm yorumları bulma girişimi konusuna bir göz atmayı düşünür müsünüz? Teşekkürler!! – bouncingHippo

11

:

kodunuza aşağıdaki ekleyerek ayıklama çıkışı sağlayan, Gelincik yapıyor ensureIndex aramaları görmek için bazı entegrasyon testleri yapın, böylece koleksiyonlarınızı hızlı bir şekilde düşürmeniz gerekecek. Bu durumda, mongoose, autoIndex seçeneği true olarak ayarlanmış olsa bile çalışma zamanında dizinleri yeniden ayarlamaz. Bu cevap bu durumda yararlı olabilir.

1

İlk authorName sahada dizini tanımlayabilir ve elle çünkü belirli ihtiyacının ensureIndex çağırmak istiyorsanız o zaman yanlış için Autoindex ayarlamanız gerekir. Bu şema aşağıdaki gibi görünür: Eğer bu şemayı yani ProjectModel.ensureIndexes() kullanarak oluşturduğunuz o modele ensureIndexes yöntemi çağırabilirsiniz ihtiyacı dayalı

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

Ve;

2

Eğer endeks olayı createing dinleyebilirsiniz indeksi

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

oluşturmak için Şema # endeksi yöntemi çağırabilirsiniz.

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

Not: endeksi oluşturma işlemi asynchronous.so olan benzersiz bir dizin oluştururken, yinelenen verileri eklemek olamaz. veya dizin oluşturulmayacak;