如何对嵌套字段执行mongoengine查询?

2024-10-01 07:14:42 发布

您现在位置:Python中文网/ 问答频道 /正文

所以基本上我有这些文件

class Tag(Document):
    name = StringField()
    ...

class Doc(Doument):
    nameTag = ReferenceField(Tag)
    tags = ListField(ReferenceField(Tag))

我想查询具有特定名称的名字标签。所以我认为问题在这里得到了回答 How to perform such filter queries in mongoengine on nested dicts or arrays contained in dict with python?

但当我试着问:

^{pr2}$

我知道错误了

Cannot perform join in mongoDB: nameTag__name

Tags: 文件namein名称doctagtagsdocument
3条回答

您可以通过使用本机Django ORM本身,以mongodb为后端,跨两个集合执行联接。因此,您不需要使用Mongoengine。在

使用django orm并使用类似于djongo 的连接器将其连接到mongodb

Mongodb没有连接,但是您的查询尝试跨两个集合进行查询。在这种情况下,您必须执行两个查询。一个用于获取匹配的标记,另一个用于查询Doc集合并查找对该标记的任何引用。在

只是说说所有的选择。 @罗斯是对的。Mongodb没有连接。但实际上你有两个选择(不仅仅是一个):

  1. (由@Ross描述)

you have todo two queries. One to get the matching Tag and then one to query the Doc collection and find any references to that Tag.

  1. 进行聚合,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返回一个文档列表。但在您的情况下,每个列表总是一个文档,所以您可以毫无疑问地使用此代码。在

第二种方法似乎比第一种方法复杂得多。但对于第一个方法,您必须对数据库执行两个查询(第二个方法只有一个)。在某些情况下,第二种方法会更有效。在

相关问题 更多 >