node.js - 在 GraphQL 中处理 Mongoose 填充字段

标签 node.js mongodb mongoose graphql graphql-js

如何表示可以是简单 ObjectId 字符串或填充对象实体的字段?

我有一个表示“设备类型”的 Mongoose 架构,如下所示

// assetSchema.js

import * as mongoose from 'mongoose'
const Schema = mongoose.Schema;

var Asset = new Schema({  name : String,
                          linked_device: { type: Schema.Types.ObjectId, 
                                           ref: 'Asset'})

export AssetSchema = mongoose.model('Asset', Asset);

我试图将其建模为 GraphQLObjectType,但我对如何允许 linked_ue 字段采用两种类型的值感到困惑,一种是 ObjectId 和其他是完整的 Asset 对象(填充时)

// graphql-asset-type.js

import { GraphQLObjectType, GraphQLString } from 'graphql'

export var GQAssetType = new GraphQLObjectType({
           name: 'Asset',
           fields: () => ({
               name: GraphQLString,
               linked_device: ____________    // stumped by this
});

我已经研究过联合类型,但问题是联合类型需要将字段规定为其定义的一部分,而在上述情况下,linked_device 下没有字段linked_device 对应一个简单的 ObjectId 时的字段。

有什么想法吗?

最佳答案

事实上,您可以使用 unioninterface linked_device 字段的类型。

使用联合类型,可以如下实现GQAssetType:

// graphql-asset-type.js

import { GraphQLObjectType, GraphQLString, GraphQLUnionType } from 'graphql'

var LinkedDeviceType = new GraphQLUnionType({
  name: 'Linked Device',
  types: [ ObjectIdType, GQAssetType ],
  resolveType(value) {
    if (value instanceof ObjectId) {
      return ObjectIdType;
    }
    if (value instanceof Asset) {
      return GQAssetType;
    }
  }
});

export var GQAssetType = new GraphQLObjectType({
  name: 'Asset',
  fields: () => ({
    name: { type: GraphQLString },
    linked_device: { type: LinkedDeviceType },
  })
});

看看这个优秀的article on GraphQL union and interface .

关于node.js - 在 GraphQL 中处理 Mongoose 填充字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416005/

相关文章:

python - Pymongo如何使用全文搜索

javascript - Mongodb 检查数组的子文档中是否存在字段

javascript - MongoDB嵌入文档: size limit and aggregation performance concerns

node.js - 最好通过 NPM 或 Bower 安装下划线?

javascript - .find 不是函数错误

c# - MongoDB 在 Azure 平台上非常慢

node.js - Mongoose 模式方法是 "not a function"

node.js - PassportJS events.js :160//Unhandled 'error' connection timeout

javascript - 向用户 A 返回最新消息或从用户 A 返回最新消息的聚合查询无法正常工作

node.js - 在一篇文章中使用 2 个中间件功能