Feb-12-2018, 11:40 AM
I am using the re module to interpret wildcards in my input functions and I am attempting to write a Python Script that will look in the database named "test" and the collection named "zips" and pull data based on what I input. So first it will ask what kind of search I want and then it will ask the criteria. The criteria should be flexible so if there is a wildcard, I need it to be able to pull any similar or matching criteria. For example if I did a "State" search and the criteria I input was M* - I would want MD, MA, MO, MI, and MS results... What I am getting instead is if I use a wildcard, Python / MongoDB is literally spilling out the contents of the ENTIRE collection, and not just the filtered results of MD, MA, MO, MI.. ect.. happens on any kind of search as well. If I do just a specific search lets say "MO" then I only get MO results but if I do M* then I get things that start with A, B, C ect..and many that don't even have M in it at all..its spilling the entire collection.
Here is my code: What can I do to fix this?
Here is my code: What can I do to fix this?
## PyMongo database import and query tool is designed to import Documents into the "zips" collection of the database named "test" which is installed on bammbamm ## The script is currently designed only to be run locally or via SSH directly from bammbamm although remote execution should be just as possible. ## Currently I only know how to retrieve specific documents but later intend to add functionality to display all documents within a Collection simultaneously. ## Imports import pymongo import re from pymongo import MongoClient connection = MongoClient() ## Connection Definitions db = connection.test collection = db.zips ## Startup Variables & Definitions search = 0 #### Defines and enables the search variable. query = 0 #### Defines and enables the query variable. query_type = 0 #### Defines and enables the query variable. start_counter = 0 #### Defines and enables the start counter, setting it to 0 when the program is launched, it will later be set to 1 so the start message will not unecessarily repeat itself. def Hello_Message(): #### The startup message. print ("Welcome to the MongoDB / Python debug tool. Remember to close this tool at any time, press Ctrl+C.") print ("To search the MongoDB, First select a search method, and then type in your search parameters.") print ("Search methods are as follows:") def Instructions(): #### Prints the list of instructions. print ("Use 'O' for (O)bject ID") print ("Use 'P' for (P)opulation") print ("Use 'L' for (L)ocation") print ("Use 'C' for (C)ity") print ("Use 'S' for (S)tate") def Input(): #### Assigns the "search" variable to a search method - O for Object ID, N for Name, ect - this later tells the query tool by which means you will be searching. global search search = input("Please select your search method: ") def Query(): global query global query_type if search == 'O': query_type = '_id' query = input("Object ID Search: ") elif search == 'P': query_type = 'pop' query = int(input("Population Search: ")) elif search == 'L': query_type = 'loc' query = input("Location Search: ") elif search == 'C': query_type = 'city' query = input("City Search: ") elif search == 'S': query_type = 'state' query = input("State: ") else: print ('Invalid search option, please try again.') ## Program while start_counter == 0: Hello_Message() start_counter = 1 while start_counter == 1: print (" ") Instructions() print (" ") Input() print (" ") Query() print (" ") results = db.zips.find({query_type:re.compile(query)}) #### Results are compiled into a list defined by the query. This allows us to display multiple results based on multiple querries. for result in results: print (result) print (" ") print (" ")