2011-08-29 4 views
2

J'utilise Mongodb pour stocker la liste des emplacements dans le monde, avec plus de 2M enregistrements. Chaque enregistrement est un objet comme celui-ci:Requête Mongodb par expression régulière

{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" } 

Je veux effectuer la recherche pour obtenir toutes les « villes » contiennent « New York », il m'a fallu environ 10 secondes pour avoir le résultat (il est inacceptable dans mon système web). J'ai indexé la "ville" en utilisant la fonction ensureIndex(), mais la requête est toujours lente.

Voici ma question:

db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }}) 

Je suppose que le problème est la "expression régulière". Pouvez-vous me suggérer une solution pour obtenir le résultat de la requête dans les 2-3 secondes (j'ai plus de 4M enregistrements dans MySQL, la requête similaire m'a pris seulement 1-2 secondes - avec des index).

Merci et salutations.

Répondre

8

Vous ne pouvez pas effectuer de recherche avec l'opération contain dans mongodb sans utiliser regexp ou javascript (ils sont lents, à cause du travail sans index).

Je peux suggérer de stocker la ville supplémentaire en minuscules et rechercher par match complet. Si vous voulez 'contient' et la vitesse rapide, vous devez utiliser un autre moteur de recherche en texte intégral comme solr ou lucene.

+0

de Grande réponse! Merci! – ofecrpnr

+0

@ofecrpnr: vous êtes les bienvenus. –

3

Je recommande d'utiliser plusieurs touches.

exemple:

{ title : "this is fun" , 
    _keywords : [ "this" , "is" , "fun" ] 
} 

vous pouvez utiliser

db.articles.findOne({ _keywords: "this" }) 

ce sera plus rapide

2

mongo n'utilise pas l'index pour regexp quand il recherche avec insensible à la casse Je suggère donc vous pouvez stocker votre champ en majuscules ou en minuscules et l'utiliser pour la recherche.

au lieu de recherche contenant si vous effectuez une recherche commencer avec comme ci-dessous

db.locations.find ({ "ville": { "$ regex":/^ New York /}})

votre requête reviendra vite.

pour plus d'infos
http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

Questions connexes