使用 GraphQL Query 在与 mongoose 聚合后从 MongoDB 获取结果

Posted

技术标签:

【中文标题】使用 GraphQL Query 在与 mongoose 聚合后从 MongoDB 获取结果【英文标题】:Use GraphQL Query to get results form MongoDB after aggregation with mongoose 【发布时间】:2020-12-03 14:32:03 【问题描述】:

所以我有以下问题。 我有一个 mongoDB 集合和一个对应的 mongoose 模型,看起来像这样。

export const ListItemSchema = new Schema<ListItemSchema>(
  title:  type: String, required: true ,
  parentId:  type: Schema.Types.ObjectId, required: false ,
);

export const TestSchema = new Schema<Test>(
  
    title:  type: String, required: true ,
    list:  type: [ListItemSchema], required: false ,
  
);

如您所见,我的 TestSchema 包含一个 ListItems 数组 -> TestSchema 也是我在 MongoDB 中的集合。

现在我只想从具有特定 ID 的测试中查询我的 ListItems。 好吧,至少从 MongoDB 方面来看,这并不是什么大问题。 我为此使用 MongoDB 聚合框架,并在自定义解析器中调用我的聚合。

这是从特定 TestModel 获取仅包含我的 listItems 数组的代码

const test = TestModel.aggregate([
      $match: _id: id,
      $unwind: "$list",
      
        $match: 
          "list.parentId": $eq: null,
        ,
      ,
      $replaceRoot: newRoot: "$list",
    ]);

这是结果

[  _id: randomId,
    title: 't',
    parentId: null ,
   _id: randomId,
    title: 'x'
    parentId: null 
 ]

触发解析器的查询如下所示,并放置在我的测试类型编辑器中。

query getList 
    test(testId:"2f334575196fe042ea83afbf", parentId: null) 
    title
  

到目前为止一切都很好......但是! Ofc 我的查询将失败或将导致不太好的结果^^,因为 GraphQL 需要基于测试模型的数据,但接收到一个完全随机的数组。

所以在这里打了很多字之后就是这个问题:

如何更改我的查询以接收列表数组? 我必须调整查询还是与猫鼬有关?

我真的停留在这一点上,所以任何帮助都会很棒!

提前致谢:)

【问题讨论】:

【参考方案1】:

我不确定我是否正确理解了您的问题。 在您的 graphql 中,尝试从 Query 类型中省略感叹号(!)。

类似:

type Query 
   test: TestModel

而不是

type Query 
   test: TestModel!

然后您将在控制台中收到错误消息,但仍然能够接收任何形式的数据。

【讨论】:

以上是关于使用 GraphQL Query 在与 mongoose 聚合后从 MongoDB 获取结果的主要内容,如果未能解决你的问题,请参考以下文章

graphql.GraphQLSchema:使用啥类型的参数来获取查询以传递给 mongo db.collection.find 来解析查询

Spring数据mongo在Query中使用OR

无法使用 React-Query + Graphql-Request 在 useQuery 中传递参数

如何在 .graphql 文件中编写 GraphQl Upsert Query

如何在 router.query 之后运行 GraphQL 查询?

尝试使用 React Apollo Query 组件进行 GraphQL 查询,打字稿导致错误