首页 > 解决方案 > 在嵌套对象中读取嵌套对象

问题描述

我的问题是读取嵌套对象的属性,该对象位于其他嵌套对象内。

GraphQL

type Mapping {
    id: ID!
    partnerSegmentId: ID!
    ctSegmentId: CtSegment!
}

type PartnerSegment {
    id: ID!
    name: String!
    platformId: Int!
    partner: Partner!
}

type Partner {
    id: ID!
    name: String!
}

一旦我尝试像这样查询它:

{
  allMappings {
    partnerSegmentId {
      id
      name
      partner {
        id
      }
    }
  }
}

我收到:

{
  "data": {
    "allMappings": [
      null
    ]
  },
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Partner.name.",
      "locations": [
        {
          "line": 8,
          "column": 9
        }
      ],
      "path": [
        "allMappings",
        0,
        "partnerSegmentId",
        "partner",
        "name"
      ]
    }
  ]
}

映射架构

const mappingSchema = new mongoose.Schema(
    {
        partnerSegmentId: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'PartnerSegment',
            required: [true, 'Mapping must have partner segment id.']
        },

        ctSegmentId: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'CtSegment',
            required: [true, 'Mapping must have CT segment id.']
        }
    },
    { timestamps: true }
);

我尝试分别阅读 Partner、PartnerSegment 和 Mapping 模型。一切正常。知道我应该在哪里搜索问题的根源吗?我检查了 mongodb 文档,ids 看起来还不错。我想这是我的模型的错。

如果你想仔细看看它的项目 repo

标签: javascriptnode.jsmongodbmongoosegraphql

解决方案


解决方案:

返回值中的垃圾 ID 是由嵌套实体中的填充无效引起的。我设法解决问题的方式:

const allMappings = () =>
    Mapping.find({})
        .populate('user')
        .populate('ctSegment')
        .populate({
            path: 'partnerSegment',
            populate: {
                path: 'partner'
            }
        })
        .exec(); 

推荐阅读