嵌套的 Mongoose 查询数据未显示在 GraphQL 查询中

Posted

技术标签:

【中文标题】嵌套的 Mongoose 查询数据未显示在 GraphQL 查询中【英文标题】:Nested Mongoose queries data not showing on GraphQL query 【发布时间】:2020-01-28 14:24:53 【问题描述】:

我正在尝试使用带有 GraphQL 和 Mongoose 的 Apollo-server 创建一个 API。 我的问题是对 Mongoose 的查询确实返回了数据,但 GraphQL 模型在我测试时显示为 null

我尝试了不同的方法并使用了 Promise。

    type Articulo 
        id: ID
        nombre: String
        codigoDeBarras: String
        codigo: String
    
    type EntradaInventario 
        id: ID
        articulo: Articulo
        inventario: Inventario
        cantidad: Float
    
    type Almacen 
        id: ID
        nombre: String
    
    type Inventario 
        id: ID
        almacen: Almacen
        nombre: String
    
    type Query 
        articulo(codigoDeBarras: String): Articulo
        entradaInventario(inventario: String): [EntradaInventario]
    
    type Mutation 
        addEntradaInventario(idArticulo: String, idInventario: String, cantidad: Float): EntradaInventario
        addAlmacen(nombre: String): Almacen
        addInventario(idAlmacen: String, nombre: String): Inventario
    
    const EntradaInventarioModel = Mongoose.model("EntradaInventario", 
    _id: Schema.Types.ObjectId,
    idArticulo: type: Mongoose.Schema.Types.ObjectId, ref: 'Articulo',
    idInventario: type: Mongoose.Schema.Types.ObjectId, ref: 'Inventario',
    cantidad: Number
, "entradainventarios");

    Query: 
        articulo: (_, args) => ArticuloModel.findOne(
            'codigoDeBarras': args.codigoDeBarras
        ).exec(),
        entradaInventario: (_, args) => 
            EntradaInventarioModel.find(idInventario: args.inventario)
            .populate('idArticulo')
            .exec(),
    

【问题讨论】:

【参考方案1】:

您不应该在父模型上使用填充。相反,您应该定义如何在 EntradaInventario 解析器中查询嵌套模型。

库存应如下所示:

Inventory : 
    articulo: async (parent, args,  ) => 
      return await Articulo.findOne(
        _id: parent.idArticulo,
      );
    ,
  

这是一个可以做到这一点的 repo,它是一个很好的例子 https://github.com/the-road-to-graphql/fullstack-apollo-express-mongodb-boilerplate

【讨论】:

库存应该是一个新查询还是在 entradaInventario 解析器中? 您的entradaInventario 查询应该只有EntradaInventarioModel.find(idInventario: args.inventario) 命令。 EntradaInventario 类型应该有一个解析器,用于查询该类型上的 articulo 和 inventario 字段 GraphQL 会知道去EntradaInventario 的解析器来获取文章和发明

以上是关于嵌套的 Mongoose 查询数据未显示在 GraphQL 查询中的主要内容,如果未能解决你的问题,请参考以下文章

如何处理一对多关系中的嵌套 mongoose 查询和异步问题?

NestJs mongoose 嵌套填充未按预期工作

使用 Mongoose 查询嵌套的嵌入文档

Mongoose:通过 findOneAndUpdate 查询使用嵌套对象数组的总和更新父子数据属性不起作用

Mongoose 可选嵌套属性 - 检查空/未定义?

Mongoose 可选嵌套属性 - 检查空/未定义?