python - MongoClient() 成功,但 Database(MongoClient(), dbName) 返回 NoneType

标签 python mongodb python-2.7 pymongo

我正在尝试实现 MongoDB 连接处理程序,但遇到了一个问题,我的 Database即使我的 MongoClient() 调用成功,调用也会返回 None

#mongoconn.py

from pymongo import MongoClient
from pymongo.database import Database

class MongoConnection():
    mongoconn = None

    def __init__(self, db=None, collection=None, endpoint=None):
        self.mongodb = db
        self.mongocollection = collection
        self.mongoendpoint = endpoint
        mongoconn = self.__mongo_connect()

    def __mongo_connect(self):
        if self.mongoendpoint is not None: 
            mc = MongoClient(host=self.mongoendpoint, port=27017, document_class=dict, tz_aware=False, connect=True)
            print mc    #successful object
            return Database(mc)
        else: 
            mc = MongoClient(host='localhost', port=27017, document_class=dict, tz_aware=False, connect=True)
            print mc    #successful object
            return Database(mc, self.mongodb)

m1 = MongoConnection("torbot")

print m1.mongoconn    # None

我可以看到这个集合 torbot 确实存在,所以我不认为这就是问题所在:

MongoDB shell version v3.4.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0
use torbot
switched to db torbot
db.requests.find();
{ "_id" : ObjectId("584f7e17bc1d1b7f37d54756"), "requestor" : "ctote", "request" : "Scott Pilgrim Vs The World" }

但我找不到任何调试选项来了解为什么调用 Database(mc, self.mongodb) 失败。

最佳答案

mongoconn 是一个类属性,要在 __init__ 方法中访问它,您需要在其前面加上类名或 self 前缀。在您的情况下,您正在执行的 self.mongoconn 将创建一个实例属性,这可能不是您想要的,所以您需要的是 MongoConnection.mongoconn = self.__mongo_connect() 。您的 __init__ 方法变为:

class MongoConnection():
    mongoconn = None

    def __init__(self, db=None, collection=None, endpoint=None):
        self.mongodb = db
        self.mongocollection = collection
        self.mongoendpoint = endpoint
        MongoConnection.mongoconn = self.__mongo_connect()

我不知道你正在做的事情是否是你应该做的事情

关于python - MongoClient() 成功,但 Database(MongoClient(), dbName) 返回 NoneType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126564/

相关文章:

python - 用列表列表中的第一个元素制作字典

python - 序列化器中的权限检查,Django 休息框架,

python - 寻找 xarray 的质心

arrays - 如何在 mongodb 中更新多个数组元素

linux - 无法将 Mongo 作为服务运行

python - 如果字符串单词包含特定字符,则删除包含该字符的单词

python - 绑定(bind)在销毁后保持事件状态

Python __init__() 如何不覆盖重要功能?

node.js - PhoneJS w Ripple模拟器无法连接到本地 Node 服务器

python - 使用生成器发送方法。仍在尝试理解发送方法和古怪的行为