РЕШЕНО:
Это работает:
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 . Что мне нужно изменить?