【问题标题】:How to perform a mongoengine query of a nested field?如何执行嵌套字段的 mongoengine 查询?
【发布时间】:2013-12-04 22:10:11
【问题描述】:

所以基本上我有这些文件

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

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

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

但是当我尝试查询时:

name="Hello"
docs1 = Doc.objects(nameTag__name=name)
docs2 = Doc.objects(tags__name=name)

我得到了错误

Cannot perform join in mongoDB: nameTag__name

【问题讨论】:

    标签: python django mongodb mongoengine


    【解决方案1】:

    仅提及所有选项。 @罗斯是对的。 Mongodb 没有连接。但实际上你有 2 个选项(不仅仅是一个):

    1. (由@Ross 描述)

    你必须做两个查询。一个获取匹配的标签,然后一个获取 查询 Doc 集合并找到对该标签的任何引用。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您可以使用原生 Django ORM 本身,以 mongodb 作为后端,跨两个集合执行连接。因此,您不需要使用 Mongoengine。

        使用django orm 并使用djongo 之类的连接器连接mongodb

        【讨论】:

          猜你喜欢
          • 2019-05-05
          • 2022-01-15
          • 1970-01-01
          • 2014-02-03
          • 1970-01-01
          • 2022-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多