Как использовать операторы запросов mongoengine при запросе вложенных полей - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь найти текст в базе данных mongodb, используя python и mongoengine. Документы в mongodb структурированы следующим образом:

{'title': "Food will define the future',
        'paragraphs':[
             {'text': 'Consumers in the UK are drinking less milk',
              'labels': ['market trends', 'UK']},
             {'text': 'In France, people eat a lot of cheese',
              'labels': ['market trends', 'France']}
          ]
}

Используя mongoengine, я хочу искать ключевые слова (например, «молоко») в текстовых полях каждого из документов следующим образом:

class Article(db.Document):
    title = StringField()
    paragraphs = ListField()


selection = Article.objects(paragraphs__text__contains = 'milk')

Похоже, что оператор contains ничего не делает. Возвращаются только абзацы, которые состоят из слова «молоко» и ничего другого (т.е. точное совпадение). Что не так? как это сделать правильно?

1 Ответ

0 голосов
/ 07 августа 2020

Мне удалось заставить все работать. Очевидно, что в моих моделях абзацы были определены как ListField (), например:

class Article(db.Document):
    title = StringField()
    paragraphs = ListField()

Теперь я явно определил абзацы как EmbeddedDocumentListField (), вот так

class Paragraph(EmbeddedDocument):
    text = StringField()
    labels = ListField()

class Article(db.Document):
   title = StringField()
   paragraphs = EmbeddedDocumentListField(Paragraph)

После этого изменения запрос (включая оператор 'contains') ведет себя так, как ожидалось.

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

...