首页 > 解决方案 > 使用 GraphQL Query 在与 mongoose 聚合后从 MongoDB 获取结果

问题描述

所以我有以下问题。我有一个 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 需要基于测试模型的数据,但会收到一个完全随机的数组。

所以在这里打了很多字后,问题是:

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

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

提前致谢 :)

标签: mongodbmongoosegraphqlapollo

解决方案


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

就像是 :

type Query {
   test: TestModel
}

代替

type Query {
   test: TestModel!
}

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


推荐阅读