2017-08-05 2 views
1

J'ai fait des recherches, mais ce ne trouve pas pourquoi ce que je suis en train ne fonctionne pas, et je préviens que je suis un peu nouveau pour python et très nouveau pour MongoDB. J'ai une base de données mongo de tweets en JSON que j'essaye d'interroger via Python et pymongo. Je veux retourner les champs 'text' et 'created_at' pour tous les tweets contenant "IP".Interrogation « comme » dans pymongo

J'ai essayé ce qui suit, qui fonctionne parfaitement quand je le fais à travers le terminal:

db.tweets.find({text:/IP/},{text:1,created_at:1}) 

En Python, après avoir expérimenté, j'ai trouvé que je dois mettre les noms de champs entre guillemets. J'ai obtenu la requête similaire suivante au travail:

cursor = db.tweets.find({'created_at':"Thu Apr 28 09:55:57 +0000 2016"},{'text':1,'created_at':1}) 

Mais lorsque je tente:

db.tweets.find({"text": /.*IP.*/},{'text':1,'created_at':1}) 

ou

cursor = db.tweets.find({'text':/IP/},{'text':1,'created_at':1}) 

-je obtenir un

'SyntaxError: invalid syntax' at the "/IP/" part of the code. 

J'utilise mongo 3.4.6 et python 3.5.2

Répondre

2

Python n'a pas une syntaxe spéciale pour regexes comme a JavaScript.

En utilisant re

Vous devez compilez le regex avec le re module:

import re 

rgx = re.compile('.*IP.*', re.IGNORECASE) # compile the regex 

cursor = db.tweets.find({'text':rgx},{'text':1,'created_at':1})

Vous pouvez utiliser re.IGNORECASE comme drapeau si vous voulez faire correspondre iP, Ip et ip ainsi. Si vous ne le souhaitez pas, vous pouvez supprimer la pièce re.IGNORECASE.

En utilisant la notation '$regex'

Vous pouvez également spécifier que vous travaillez avec un regex avec:

cursor = db.tweets.find({'text':{'$regex':'IP'}},{'text':1,'created_at':1})