如何在没有 _id 参考的情况下获取 GraphqQL 列表中模型的填充值?
Posted
技术标签:
【中文标题】如何在没有 _id 参考的情况下获取 GraphqQL 列表中模型的填充值?【英文标题】:How to get the Populated values of a model in GraphqQL list without _id reference? 【发布时间】:2019-05-04 18:06:41 【问题描述】:我有一个包含一些字段并引用“技能”模型的用户模型。
模型如下所示
1.Users.js(用户模型)
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const UsersSchema = new Scheam(
name: type : String ,
email: type : String ,
address: type : String ,
Skills: [ type: mongoose.Schema.Types.ObjectId, ref: 'Skills' ],
)
module.exports = mongoose.model('Users', UsersSchema);
2.技能模型
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const SkillsSchema = new Schema(
name : type: String ,
);
module.exports = mongoose.model('Skills', SkillsSchema);
我正在使用存储用户模型中技能 ID 的技能选择下拉菜单创建新用户。
并通过在 node js 应用程序中像这样填充用户模型来获得技能。
export function getUser(req, res)
console.log('getUser');
console.log('req.body',req.body);
Users.findOne(_id: req.body.user_id).populate('skills').exec(function(err, usr_doc)
if(err)
res.json(
status: 401,
message: 'something went wrong!',
err: err,
);
else if (!err && usr_doc != null)
res.json(
status: 200,
message: 'User details found!',
data: _id: usr_doc._id, skills: usr_doc.skills,name: usr_doc.name,token: usr_doc.token,
)
)//Users.findOne end
上面的代码对于普通的rest api工作正常。
这里我尝试在 Nodejs 中使用 express-graphql 的 GraphQL 服务器创建相同的 api。
代码如下所示。
3.Schema.js
const graphql = require('graphql');
const Users = require('../models/Users');
const Skills = require('../models/Skills');
const
GraphQLObjectType,
GraphQLInt,
GraphQLFloat,
GraphQLString,
GraphQLSchema,
GraphQLID,
GraphQLList,
GraphQLNonNull,
GraphQLBoolean,
GraphQLObject
= graphql;
const UsersType = new GraphQLObjectType (
name: 'Users',
fields: () => (
id: type: GraphQLID,
name: type : GraphQLString ,
email: type : GraphQLString ,
**skills:
type: new GraphQLList(SkillsType),
resolve(parent, args)
//Here I need to know how to get the skills name of the users
**
)
const SkillsType = new GraphQLObjectType(
name: 'Skills',
fields: () => (
name: type : GraphQLString ,
)
)
目前我在技能模型中没有使用任何参考id,只有名称。我想获取用户的技能名称。
如果我使用以下内容,我将获得所有技能名称,而不是用户特定或填充的技能名称。
skills :
type: new GraphQLList(SkillsType),
resolve(parent, args)
return Skills.find()
请就此提出任何建议。
如果您需要,我可以提供更多信息。
【问题讨论】:
你试过了吗? resolve(parent, args) //这里需要知道如何获取用户的技能名 return await Skills.find("_id": $in: parent.skills ) 嗨@Shivam Pandey,我试过你的代码,它就像一个魅力。请发布它作为答案,我会接受它。谢谢。 当然@Venkatesh Somu 嗨@Shivam Pandey。我对在 CreateUser Mutation 中保存技能 ID ["123213","3234434","2231232"] 等数组值有一点疑问。你能告诉我如何定义数组值的模式类型并将它们保存在解析函数中。 基本上需要加上input
关键字,输入UserInput 技能:[String]
【参考方案1】:
要获取用户的skills
,而不是返回技能集合中存在的所有文档的Skills.find()
,请在此处添加带有parent
对象的条件。
parent
对象,其中包含来自父字段的解析器的结果。所以技能,一个子解析器,可以写成:
skills:
type: new GraphQLList(SkillsType),
resolve(parent, args)
return await Skills.find("_id": $in: parent.skills )
【讨论】:
以上是关于如何在没有 _id 参考的情况下获取 GraphqQL 列表中模型的填充值?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何从 GraphQL 的 RequestContextHolder 获取 GraphQL 的 HttpServletRequest(DefaultGlobalContext)(使用 graphq
MySQL:在没有 auto_increment 的情况下获取最后插入的主键