@froosty

Как сделать запрос в mongoalchemy, с условием равенства 2-х полей документа?

Доброго времени суток. У меня есть модель для mongoalchemy:

class ImportProductReport(mongo.Document):
    target = mongo.IntField(default=0)
    processed = mongo.IntField(default=0)
    is_in_process_remove_offers = mongo.BoolField(default=False)
    is_old_offers_removed = mongo.BoolField(default=False)
    ...


Мне нужно вытащить записи, для которых:
- ImportProductReport.is_in_process_remove_offers == False,
- ImportProductReport.is_old_offers_removed == False,
- ImportProductReport.target == ImportProductReport.processed.

Запрос без последнего условия работает хорошо:

res = ImportProductReport.query\
    .filter(
        ImportProductReport.is_old_offers_removed == False,
        ImportProductReport.is_in_process_remove_offers == False
    )\
    .all()


Но если написать что-то вроде этого:

res = ImportProductReport.query\
    .filter(
        ImportProductReport.is_old_offers_removed == False,
        ImportProductReport.is_in_process_remove_offers == False,
        ImportProductReport.target == ImportProductReport.processed
    )\
    .all()


То получаем оишбку:

AttributeError: 'bool' object has no attribute 'obj'


Подскажите, как добавить условие "одно поле документа равно второму полю документа". Заранее спасибо за ответ.
  • Вопрос задан
  • 255 просмотров
Решения вопроса 1
@froosty Автор вопроса
Если вдруг кому-то поможет, то нашёл ответ на свой вопрос.

Mongoalchemy позволяет делать запросы с синтаксисом, подобным первоначальному синтаксису MongoDB.

Поэтому нужный мне запрос можно записать следующим образом:

res = ImportProductReport.query\
    .filter({
        'is_old_offers_removed': False,
        'is_in_process_remove_offers': False,
        '$where': 'this.target == this.processed'
    })\
    .all()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы