在 GraphQL 中过滤嵌入的文档列表

问题描述

我正在使用 MongoDB 后端(通过 MongoEngine)在 Python/Graphene 中构建 GraphQL 应用程序。一切都运行良好,但注意到没有很多文档用于处理嵌入文档的嵌套列表。我认为 GraphQL 的一项强大功能是能够仅投射您想要的属性,但似乎并非完全如此。

以这个集合为例:

[
  {
    "name": "John Doe","age": 37,"preferences": [
      {
        "key": "colour","value": "Green"
      },{
        "key": "smell","value": "onions cooking in butter"
      },...
    ]
  },...
]

如果我想通过 GraphQL 查找特定对象,我会通过像这样的查询来查找

{
    person(name: "John Doe"){edges{node{
      name age preferences{edges{node{
        key value
      }}}
    }}}
}

但这可能会带回数百个嵌套文档。我想做的是将请求的嵌套文档标识为投影请求的一部分。

{
    person(name: "John Doe"){edges{node{
      name age preferences(key: "colour"){edges{node{
        key value
      }}}
    }}}
}

我阅读 GraphQL 规范的理解是这些子查询是不可能的,但想先与专家确认。如果可能,我将如何实现它以支持这些类型的请求?

更新也许模式示例会提供一些更有见地的响应。

class PreferenceModel(mongoengine.EmbeddedDocument):
    key = mongoengine.fields.StringField()
    value = mongoengine.fields.StringField()


class Preference(graphene_mongo.MongoengineObjectType):
    class Meta:
        interfaces = (graphene.relay.Node,)
        model = PreferenceModel


class PersonModel(mongoengine.Document):
    Meta = {'collection': 'persons'}
    name = mongoengine.fields.StringField()
    age = mongoengine.fields.IntField()
    preferences = mongoengine.fields.EmbeddedDocumentListField(PreferenceModel)


class Person(graphene_mongo.MongoengineObjectType):
    class Meta:
        interfaces = (graphene.relay.Node,)
        model = PersonModel


class Query(graphene.ObjectType):
    person = graphene_mongo.MongoengineConnectionField(Person)

schema = graphene.Schema(query=Query,types=[Person])
app = starlette.graphql.GraphQLApp(schema=schema)

使用上述结构,需要进行哪些更改以允许对嵌套对象进行查询/过滤器?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...