Nano Hash - криптовалюты, майнинг, программирование

Сделать методы класса Python доступными для поиска в Mongodb

У меня есть коллекция 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'})]

Таким образом, поиск более эффективен, но я думаю, что необходимость обновлять дочерние объекты может быть болезненной и опасной. Если я изменю имя родителя, я должен также переписать его дочерние элементы. Чувствует себя неправильно. Есть идеи получше???


Ответы:


1

Вам не нужно загружать все Children.

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

(Кроме того, почему у вас есть поле child в родительском элементе и поле parent в дочернем элементе?)

14.08.2012
  • Спасибо, это правда. Родитель/ребенок — слабый пример. В моей реальной модели нет круговых ссылок. Спасибо еще раз! 14.08.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..