Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对嵌套字段执行mongoengine查询?_Python_Django_Mongodb_Mongoengine - Fatal编程技术网

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没有连接。但实际上,您有两种选择(不仅仅是一种):

  • (由@Ross描述)
  • 您必须执行两个查询。一个获取匹配的标签,然后一个获取匹配的标签 查询文档集合并查找对该标记的任何引用

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

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