如何在没有 _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 的情况下获取最后插入的主键

如何使用 BigQuery 在没有每个元素的情况下获取所有总和值?

怎样用ThinkPHP在添加数据前获取自增长主键的下一个值

Mongodb graphQL和Feather js数据通过_id获取在某些情况下返回null