2014-09-19 4 views
0

J'utilise mangouste et ont un schéma semblable à ceci:index correct mongo pour une grande requête

var schema = new mongoose.Schema({ 
    created: Date, 
    fieldA: ObjectId, 
    fieldB: ObjectId, 
    fieldC: ObjectId, 
    sortField: Number 
}); 

Ceci est une grande collection, donc je veux vous assurer que les index sont optimaux. Je construis une requête avec quelque chose comme ceci:

var query = Schema.find({created: some-date-clause}); 
if (some-condition) 
    query = query.or({fieldA: {$in: listOfSomeFieldAIDs}}); 
if (some-other-condition) 
    query = query.or({fieldB: {$in: listOfSomeFieldBIDs}}); 
if (yet-another-condition) 
    query = query.or({fieldC: {$in: listOfSomeFieldCIDs}}); 

query = query.sort({sortField:-1}); 

Je veux vous assurer que quelle que soit la requête est, il est entièrement couvert. Mon instinct est de créer un index qui couvre les champs créés, fieldA, fieldB, fieldC et sortField. Mais dois-je réellement créer plusieurs indices pour les situations où par exemple seulement la deuxième condition est vraie, ou le premier et le troisième sont vrais? Devrais-je aborder cela différemment?

Répondre

1

Chaque clause d'une requête $or est considérée comme indépendante, il est donc probable préférable de créer trois indices distincts, un par fieldA, fieldB et fieldC. Voir les documents here.

Le genre se produit après les résultats des trois $or clauses sont fusionnées, ajoutant ainsi sortField à ces indices n'est pas susceptible d'être utile.

Mais comme toujours, validez toute approche d'index en utilisant explain() pour vous assurer que vos requêtes peuvent utiliser les index que vous avez créés.

+0

Très utile, merci @JohnnyHK. – thejav

Questions connexes