我正在使用一个看起来像这样的模型
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));
}
});
但是我不确定这是否正确。有什么建议吗?