是否可以在同一模型之间添加关系?

时间:2019-11-27 09:27:40

标签: graphql-compose-mongoose graphql-compose

我正在使用一个看起来像这样的模型

document{
 images:[ImageModel]
 metadata:{
   headerImage: MongoID
 }
}

因此,我在模型内部具有_id和所有详细信息的图像数组。然后,在其他字段或嵌套字段中,我使用其ID引用这些图像之一。问题是在GraphQL中我无法获取所引用图像的详细信息(我只能获取_id)。因此,在graphql-compose中,如何指定此ID与文档中的实际数据之间的关系?我尝试这样做

// Add the Categories Relation
ProductPageSchema.addRelation("metadata.headerImage", {
  resolver: // resolver here,
  prepareArgs: {
    _ids: source => source.metadata.headerImage,
    images: source => source.images
  },
  projection: { images: 1 }
});

但是我得到这个错误

Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but "metadata.headerImage" does not.

那么,有可能定义这种关系吗?

编辑:我找到了一种定义这种关系的方法,

DocumentSchema.getFieldOTC("metadata")
  .addRelation("image", {
    resolver: ImageResolver,
    prepareArgs: {
      _id: source => source.image
    }
  });

但是现在我在努力从顶层文档中获取实际图像,因为“源”仅指嵌套对象。这是解析器

const imageResolver = schemaComposer.createResolver({
  name: "findImages",
  type: ImageSchema,
  args: {
    _ids: "[ID!]"
  },
  resolve: ({ source, args, context, info }) => {
    // Get image from top document
    return null;
  }
});

编辑2: 我设法做到了这一点

const imageResolver = schemaComposer.createResolver({
  name: "findImages",
  type: ImageSchema,
  args: {
    _ids: "[ID!]"
  },
  resolve: async ({ source, args, context, info }) => {
    let images;
    let id = mongoose.Types.ObjectId(args._id);
    await DocumentModel.findOne(
      { "images._id": { $in: id } },
      { images: true, _id: false }
    )
      .lean()
      .exec()
      .then(res => {
        images = res.images;
      });
    return images.find(image => image._id.equals(args._id));
  }
});

但是我不确定这是否正确。有什么建议吗?

0 个答案:

没有答案