Search code examples
mongodbmongodb-querypymongopymongo-3.x

PyMongo not recognizing if the name of the collection is client


I have a cursor open on my database and I have a collection with the name client in the database. When I'm trying to execute a query like

def connect_to_primary(host, port):
    """this function is to connect to primary host in a replicaset"""
    connection = MongoClient(str(host), int(port))
    admindb = connection.admin
    pri_host_port_con = admindb.command("isMaster")
    primary_con = pri_host_port_con['primary']
    pri_host_port = primary_con.replace(':', ' ').split()
    pri_host = pri_host_port[0]
    pri_port = pri_host_port[1]
    final_connection = MongoClient(str(pri_host), int(pri_port))
    return final_connection

connect_to_primary(host,port)[db].client.find({}).distinct('clientid')

I am getting the following error:

File "/usr/lib64/python2.7/site-packages/pymongo/database.py", line 1116, in __call__
    self.__name, self.__client.__class__.__name__))
TypeError: 'Database' object is not callable. If you meant to call the 'find' method on a 'MongoClient' object it is failing because no such method exists.

what's wrong here?


Solution

  • The reason you are getting this because Database instances have a client attribute which returns the client instance of the database as shown in the following interactive Python session.

    >>> import pymongo
    >>> connection = pymongo.MongoClient()
    >>> db = connection["test"]
    >>> db
    Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'test')
    >>> db.client
    MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True)
    

    The only solution is to use the the get_collection method or the [] operator.

    >>> db["client"]
    Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'test'), 'client')
    >>> db.get_collection("client")
    Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'test'), 'client')