Запрос MongoDB по полю подкласса - PullRequest
0 голосов
/ 07 августа 2020

РЕШЕНО:

Это работает:

print("\nTrying to access by embedded_doc__embedded_int=1:")
for data in Doc.objects(embedded_doc__embedded_int=1):
    print(data)

Вы должны получить доступ к полям подкласса, используя имя переменной основного класса (не имя класса), за которым следует __, за которым следует имя переменной подкласса, как указано выше.

ОБНОВЛЕНИЕ:

Мой исходный вопрос ниже. Я написал пример, чтобы показать в сжатой и полной форме то, что я пытаюсь сделать.

В этом примере у меня есть класс Do c. Каждый Do c имеет встроенный класс с именем «embedded_do c». А внутри класса Embedded есть целое число под названием «embedded_int».

Моя цель - хранить документы в MongoDB через MongoEngine и запрашивать в базе данных документы, которые имеют embedded_do c .embedded_int == 1. Пока Я не смог понять, как это сделать.

class Embedded(EmbeddedDocument):
    embedded_int = IntField()
    
    def __eq__(self, other):
        return other == self.embedded_int
    
    def __str__(self):
        return(str(self.embedded_int))
    
class Doc(Document):
    doc_str = StringField()
    embedded_doc = EmbeddedDocumentField(Embedded)
    
    def __str__(self):
        return f"{self.doc_str} {str(self.embedded_doc)}"

data1 = Doc(doc_str = "first", embedded_doc = Embedded(embedded_int = 1))
data2 = Doc(doc_str = "second", embedded_doc = Embedded(embedded_int = 2))

#Gives correct output:
#Showing Doc objects in database:
#first 1
#second 2
print("Showing Doc objects in database:")
for data in Doc.objects():
    print(data)

#Gives correct output:
#Trying to access by doc_str='first':
#first 1
print("\nTrying to access by doc_str='first':")
for data in Doc.objects(doc_str='first'):
    print(data)

#ValueError: The source SON object needs to be of type 'dict' but a '<class 'int'>' was found
#During handling of the above exception, another exception occurred:
#mongoengine.errors.InvalidQueryError: Querying the embedded document 'Embedded' failed, due to an invalid query value
#print("\nTrying to access by embedded_doc=1:")
#for data in Doc.objects(embedded_doc=1): 
#    print(data)


#SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
#print("\nTrying to access by embedded_doc.embedded_int=1:")
#for data in Doc.objects(embedded_doc.embedded_int=1): 
#    print(data)


#NameError: name 'embedded_doc' is not defined
#print("\nTrying to access by embedded_doc.embedded_int==1:")
#for data in Doc.objects(embedded_doc.embedded_int==1): 
#    print(data)


#SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
#print("\nTrying to access by Embedded.embedded_int=1:")
#for data in Doc.objects(Embedded.embedded_int=1): 
#    print(data)


#Runs, but gives incorrect output:
#Trying to access by Embedded.embedded_int==1:
#first 1
#second 2
print("\nTrying to access by Embedded.embedded_int==1:")
for data in Doc.objects(Embedded.embedded_int==1): 
    print(data)

ОРИГИНАЛЬНЫЙ ВОПРОС:

Я использую Python + MongoDB + MongoEngine, чтобы начать работу с базой данных No SQL .

У меня есть класс Article, который содержит поле ArticleMetadata. В свою очередь, ArticleMetadata содержит поле pub_year. Я хочу запросить в своей базе данных статьи, содержащие ArticleMetadata, с pub_year == 2002. Я пробую это:

for article in Article.objects(ArticleMetadata.pub_year == 2002):
    print(article)
    input()

Но он печатает каждую статью в базе данных, а не только те, что с pub_year == 2002 . Что мне нужно изменить?

1 Ответ

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

Попробуйте ArticleMetadata__pub_year = 2002 вместо ArticleMetadata.pub_year == 2002

...