2012-03-19 4 views
2

J'essaie d'optimiser une requête mongodb. J'ai un index sur from_account_id, to_account_id, et created_at. Mais la requête suivante effectue une analyse de collection complète.Mongo utilisant des index avec tri

{ 
    "ts": { 
     "$date": "2012-03-18T20:29:27.038Z" 
    }, 
    "op": "query", 
    "ns": "heroku_app2281692.transactions", 
    "query": { 
     "$query": { 
      "$or": [ 
       { 
        "from_account_id": { 
         "$oid": "4f55968921fcaf0001000005" 
        } 
       }, 
       { 
        "to_account_id": { 
         "$oid": "4f55968921fcaf0001000005" 
        } 
       } 
      ] 
     }, 
     "$orderby": { 
      "created_at": -1 
     } 
    }, 
    "ntoreturn": 25, 
    "nscanned": 2643718, 
    "responseLength": 20, 
    "millis": 10499, 
    "client": "10.64.141.77", 
    "user": "heroku_app2281692" 
} 

Si je ne fais pas le or, et seulement la requête from_account_id ou to_account_id avec une commande sur, il est rapide.

Quelle est la meilleure façon d'obtenir l'effet désiré? Devrais-je conserver account_ids (à la fois de et à) dans un champ comme un tableau? Ou peut-être y a-t-il un meilleur moyen. Merci!

Répondre

7

Malheureusement, comme vous l'avez découvert, une clause $ ou peut compliquer la tâche de l'optimiseur. Donc, pour contourner ce problème, vous avez quelques options. Parmi eux:

  • Divisez votre requête en deux et fusionnez manuellement les résultats.
  • Modifiez votre modèle de données pour permettre une recherche efficace. Par exemple, vous pouvez ajouter un champ "referenced_accounts" qui est un tableau de tous les comptes référencés dans la transaction.
+0

+1, Les deux balles sont des recommandations solides. –

+0

Super, merci pour l'aide! –

+0

$ ou dans Mongo ne fait pas l'optimiseur ignorer les index. Il ignore les index des instructions $ ou imbriquées: https://jira.mongodb.org/browse/SERVER-3327?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs – Spencer