使Python类方法在Mongodb中可搜索

使Python类方法在Mongodb中可搜索,python,class,mongodb,pymongo,Python,Class,Mongodb,Pymongo,我有一个Mongodb集合,并且为集合中的文档创建了一个Python类。该类具有一些未与文档一起存储的属性和方法。我应该尝试存储它们以使属性可搜索,还是不应该存储它们并在Python中搜索对象 以下是一个例子: # Child class Child: def __init__(self, **kwargs): self.__dict__.update(kwargs) @property def parent(self): try:

我有一个Mongodb集合,并且为集合中的文档创建了一个Python类。该类具有一些未与文档一起存储的属性和方法。我应该尝试存储它们以使属性可搜索,还是不应该存储它们并在Python中搜索对象

以下是一个例子:

# Child
class Child:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    @property
    def parent(self):
        try:
            return Parent(**db.Parents.find_one({'child':self._id}))
        except:
            return None

# Parent
class Parent:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    @property
    def child(self):
        try:
            return Child(**db.Children.find_one({'parent':self._id}))
        except:
            return None
在本例中,要搜索所有家长名为“foo”的孩子,我必须执行以下操作:

results = [Child(**c) for c in db.Children.find() if c.parent.name == 'foo']
这意味着我必须从Mongodb中提取所有子文档并进行搜索。将父数据(或其子集)写入子文档是否更明智,这样我就可以使用Mongodb进行搜索??因此,我的儿童课程可以如下所示:

# Child
class Child:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    @property
    def parent_name(self):
        try:
            return db.Parents.find_one({'child':self._id})['name']
        except:
            return None

    def _save(self):
        # something like this to get and save all the properties
        data = {m[0]:getattr(self,m[0]) for m in inspect.getmembers(self)}
        db.Children.find_and_modify({'_id':self._id},{'$set':data},upsert=True)

# search
results = [Child(**c) for c in db.Children.find({'parent_name':'foo'})]
所以搜索效率更高,但我认为必须更新子对象可能是痛苦和危险的。如果我更改了父项的名称,我还必须重写其子项。感觉不对。有更好的主意吗?

您不必加载所有
子项

parent_ids = db.Parents.find({'name': 'foo'}).distinct('_id')
children = db.Children.find({'parent': {'$in': parent_ids}})

(还有,为什么在父项上有一个
子项
字段,在子项上有一个
父项
字段?

谢谢,这是真的。父母/孩子是一个软弱的例子。我的实际模型中没有循环参照。再次感谢!