Python 如何对嵌套字段执行mongoengine查询?
所以基本上我有这些文件Python 如何对嵌套字段执行mongoengine查询?,python,django,mongodb,mongoengine,Python,Django,Mongodb,Mongoengine,所以基本上我有这些文件 class Tag(Document): name = StringField() ... class Doc(Doument): nameTag = ReferenceField(Tag) tags = ListField(ReferenceField(Tag)) 我想查询具有特定名称的名称标签。所以我认为问题在这里得到了回答 但当我尝试查询时: name="Hello" docs1 = Doc.objects(nameTag__n
class Tag(Document):
name = StringField()
...
class Doc(Doument):
nameTag = ReferenceField(Tag)
tags = ListField(ReferenceField(Tag))
我想查询具有特定名称的名称标签。所以我认为问题在这里得到了回答
但当我尝试查询时:
name="Hello"
docs1 = Doc.objects(nameTag__name=name)
docs2 = Doc.objects(tags__name=name)
我得到了错误
Cannot perform join in mongoDB: nameTag__name
Mongodb没有联接,但您的查询正在尝试跨两个集合进行查询。在这种情况下,您必须执行两个查询。一个用于获取匹配的标记,然后一个用于查询文档集合并查找对该标记的任何引用。您可以使用本机Django ORM本身在两个集合之间执行连接,mongodb作为后端。因此,您不需要使用Mongoengine
使用并使用连接器连接mongodb,如,仅提及所有选项。 @罗斯是对的。Mongodb没有连接。但实际上,您有两种选择(不仅仅是一种):
mongoengine
支持它:
docs1 = Doc.objects.aggregate(
{"$lookup": {
"from": "tag", # Tag collection database name
"foreignField": "_id", # Primary key of the Tag collection
"localField": "nameTag", # Reference field
"as": "nameTag",
}},
{"$unwind": "nameTag"},
{"$match": {"nameTag.name": name}})
$unwind
,因为$lookup
返回文档列表。但在您的情况下,每个列表总是有一个文档,因此您可以毫无疑问地使用此代码
第二种方式似乎比第一种方式复杂得多。但使用第一种方法,您必须对数据库进行两次查询(使用第二种方法,只有一次)。在某些情况下,第二种方法会更有效