Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在motor中对集合进行子分类?_Python_Python 3.x_Mongodb_Mongodb Motor - Fatal编程技术网

Python 是否可以在motor中对集合进行子分类?

Python 是否可以在motor中对集合进行子分类?,python,python-3.x,mongodb,mongodb-motor,Python,Python 3.x,Mongodb,Mongodb Motor,所以我在我的应用程序中使用,我希望创建与数据库交互的助手函数,我最初考虑使用,但我倾向于使用ORM,尽管使例程函数更容易调用会更好 让我们以一个upsert为例: 我可以使用以下命令编写一个upsert: await collection.update_one({'key': value}, {'set': {'key': value}}, upsert = True) 但使用起来会更容易: await collection.upsert({'key': value}, {'set': {'k

所以我在我的应用程序中使用,我希望创建与数据库交互的助手函数,我最初考虑使用,但我倾向于使用ORM,尽管使例程函数更容易调用会更好

让我们以一个
upsert
为例:

我可以使用以下命令编写一个upsert:

await collection.update_one({'key': value}, {'set': {'key': value}}, upsert = True)
但使用起来会更容易:

await collection.upsert({'key': value}, {'set': {'key': value}})
甚至是
设置
方法:

await collection.set({'key': value}, {'key': value})
我有很多这样的方法,还有更多的方法,但是如果有人能给我指出正确的方向,那就太棒了

触发我问这个问题的原因是我看到中有一个
document\u类
参数,允许您指定文档的返回类型。但是没有真正简单的方法来指定自定义集合类

我知道所有这些都可以使用标准约定来完成,我只是想让事情变得更简单,因为有时候可能会有一些长的过滤、更新、投影指令,我只是想实现我自己的约定

编辑

基本上,为了将更多的上下文放在这里,我正在寻找定制函数,以减少我需要反复编写的dict的数量。以更新用户点为例;我希望能够围绕update_one函数编写一种“包装器”函数,以提高多个模块的可读性和可用性

例:


尽管这不是一个完美的解决方案,但您可以通过为db对象编写包装器类来实现这一点。在某种程度上,这个类扩展了另一个类的对象,而不是类本身


db=#获取连接
类包装器:
定义初始(自我,对象):
对于输入对象中的键。\uuuu dir\uuuu():
#跳过内部方法
如果key.startswith(“\uuuuuuu”):
持续
setattr(self,key,getattr(obj,key))
异步定义更新集(键、值、**kwargs):
update_one({key:value},{'$set':kwargs})
db=包装器(db)
等待数据库更新集合(…)
注:
您需要使用包装对象来访问
update\u set
方法。因此,最好在连接时对其进行包装。

尽管这不是一个完美的解决方案,但您可以通过为db对象编写包装类来实现这一点。在某种程度上,这个类扩展了另一个类的对象,而不是类本身


db=#获取连接
类包装器:
定义初始(自我,对象):
对于输入对象中的键。\uuuu dir\uuuu():
#跳过内部方法
如果key.startswith(“\uuuuuuu”):
持续
setattr(self,key,getattr(obj,key))
异步定义更新集(键、值、**kwargs):
update_one({key:value},{'$set':kwargs})
db=包装器(db)
等待数据库更新集合(…)
注:
您需要使用包装对象来访问
update\u set
方法。因此,连接时最好将其包装。

我尝试了简单的子类化,但它不起作用:

class MyCollection(motor_asyncio.AsyncIOMotorCollection):
    pass

my_collection = MyCollection(database=db, name='my_collection')

Traceback (most recent call last):
  File "./test.py", line 13, in <module>
    my_collection = MyCollection(database=db, name='my_collection')
  File "/usr/local/lib/python3.6/dist-packages/motor/core.py", line 528, in __init__
    super(self.__class__, self).__init__(delegate)
TypeError: __init__() missing 1 required positional argument: 'name'

我尝试了简单的子类化,但不起作用:

class MyCollection(motor_asyncio.AsyncIOMotorCollection):
    pass

my_collection = MyCollection(database=db, name='my_collection')

Traceback (most recent call last):
  File "./test.py", line 13, in <module>
    my_collection = MyCollection(database=db, name='my_collection')
  File "/usr/local/lib/python3.6/dist-packages/motor/core.py", line 528, in __init__
    super(self.__class__, self).__init__(delegate)
TypeError: __init__() missing 1 required positional argument: 'name'

该字符串
super(self.\uuuuuuu class\uuuuuuu,self)
\uuuuuu init\uuuuu
第528行的/motor/core.py中使用的问题。我的答案是试图避免递归。啊,是的,确实如此。因此,使用这个我将不得不使用
My_collection=MyCollection(database=db,name='My_collection')
,而不能使用
My_collection=db.collection
?注意:
super()。我的答案是试图避免递归。啊,是的,确实如此。因此,使用这个我将不得不使用
My_collection=MyCollection(database=db,name='My_collection')
,而不能使用
My_collection=db.collection
?这就是为什么它变得“黑”了吗?注意:
super()
的错误使用肯定是值得的。我在jira上就此事提出了一个问题,这不允许我说
db.collection.update\u set(…)
,这就是数据库现在的工作方式。我需要一种向collections
update\u one
方法添加功能的方法。这不允许我说
db.collection.update\u set(…)
这就是数据库现在的工作方式。我需要一种方法向collections
update\u one
方法添加功能。
#!/usr/bin/python3.6

import pymongo
from motor import motor_asyncio


class MyCollection(motor_asyncio.AsyncIOMotorCollection):
    def __init__(self, *args, **kwargs):
        """Calling __init__ of parent class is failing for some reason"""

    def __new__(cls, *args, **kwargs):
        collection = motor_asyncio.AsyncIOMotorCollection(*args, **kwargs)
        collection.__class__ = MyCollection
        return collection

    def my_method(self, *args, **kwargs):
        print('my method', args, kwargs)


client = motor_asyncio.AsyncIOMotorClient()
db = client.db
my_collection = MyCollection(database=db, name='my_collection')
my_collection.my_method()  # my_method () {}
assert db.my_collection == my_collection  # passes assertion