我有一个文档和一个嵌入式文档,如下所示。我想查询mongoengine中的嵌入式文档。在sql中,这将是:SELECT A.Nom_PC,B.Intitule from Comptes作为A,Vals作为B WHERE B.Num =“ some value”
class Vals(EmbeddedDocument):
Num = StringField()
Intitule = StringField()
meta = {'allow_inheritance': True}
class Comptes(Document):
Nom_PC = StringField()
PC = ListField(EmbeddedDocumentField(Vals))
meta = {'allow_inheritance': True}
我尝试了一些无法正常工作的事情:
Comptes.objects(Vals__match={ "Num": Num }).aggregate(
{'$project': {
'PC': {
'$filter': {
'input': '$PC',
'as': 'Vals',
'cond': {'$eq': ['$$Vals.Num', Num]}
}
}
}}
)
答案 0 :(得分:0)
首先,您确实应该使用
PC = EmbeddedDocumentListField(Vals)
代替
PC = ListField(EmbeddedDocumentField(Vals))
这是因为嵌入文档的列表需要特殊考虑。
关于查询:
q = Comptes.objects(PC__Num="some value")
这将为所有匹配的Comptes
文档创建查询。然后,您可以从每个文档中挑选所需的任何数据。
(如果将来需要在EmbeddedDocument中匹配多个项目,请使用match
关键字。有关更多信息,请参阅文档。)
例如:
my_list = []
for doc in q:
for v in doc.PC:
if v.Num == "some value":
my_list.append([doc.Nom_PC, v.Intitule])
对于YouTube视频,我详细介绍了EmbeddedDocumentListField:https://www.youtube.com/watch?v=ajwPOyb6VEU&index=6