使用GraphQl |在多个字段上的动态查询数据/过滤器数据| mongodb mongoose
#graphql #nestjs #mongodb #query

使用GraphQL的多个字段查询/过滤器数据是不同的,但非常有趣的任务。通过数据库过滤一直是一个简单而棘手的任务。当过滤包含多个字段时,使用GraphQL获取数据时,事情确实会变得凌乱。本文将帮助您使用GraphQL,MongoDB和Mongoose在多个字段上过滤数据。实际上,我们将通过将字段及其值作为输入来查询数据或过滤数据。这种功能通常用于电子商务网站,我们在搜索数据上应用多个过滤器,例如颜色,价格,区域,评论等。我将使用Nestjs执行此任务,但是该方法对于NodeJS是相同的,并且类似于基于JavaScript的平台。我将在文章末尾附加GitHub repo链接。

**Disclaimer:** I will skip the project creating part to keep the article short and generic for both Nest JS and Node JS, if you are new to NestJS you can see the start of my previous articles where I have mentioned the method to create a project using Nest CLI, I'll mention the link at end.  

代码库说明:

在这里,我使用的是一个有用户和手机数据库的方案。我们需要找到所有使用特定手机的用户。用户架构中保留了带有移动电话ID名称的数组,并且在DB中存在带有移动电话的单独表格。

方法说明:

我们将以GraphQL客户端的数组形式发送数据。数据将以输出为键值(field_name:value)对的对象。

的对象进行处理。

从GraphQl获取数据的解析器:

首先通过从GraphQl客户端调用GraphQl API来编写解析器来获取数据。

Nestjs:

@Query(() => [User], {name: "FindWithMultipleFields"})

findWithMultipleFields (
@Args('fields', { type: () => [String]} ) fields: any,
@Args('values', { type: () => [[String]]} ) values: any) {

return this.userService.findWithMultipleFields(fields, values);

}

nodejs:

const resolvers = 
{   
Query: {     
findWithMultipleFields(fields, values) {       
return users.findWithMultipleFields(fields, values);     
}}}

在这里,我们正在使用JS类。

将数据操纵到键值对:

现在这是主要部分,并且在节点和NEST上都相似,因为它是基本的JavaScript任务。现在,我们有字段的数组 values 的数组。我们需要以某种方式处理它,以使输出是 {field:value} Pairs的对象。

async findWithMultipleFields (fields: any, value: any): Promise<UserDocument[]> {

const result = value.reduce(function(result, field, index) {
result[fields[index]] = field;
return result;
}, {})
return await this.userModel.find(result);

}

此代码将以以下方式工作。

**Input:** 
field : [model, price]
value: ['Iphone', 20000]

**Output:**  
result: {{model: 'Iphone', price: 20000}} 

由于Mongoose查找函数采用了键值对的对象,因此我们只需要传递变量 result Model.find(),我们将获得过滤数据。

从GraphQl发送数据:

在这里,我正在附上GraphQl客户端的屏幕截图,以展示GraphQl API的调用。

Query Data/Filter Data on Multiple Fields using GraphQL | MongoDB Mongoose

在这里,我已经以数组的形式传递了数据,即使我在此处查询单个字段,但是您可以对其进行测试,并且可以在多个字段上进行工作。可以在附加的屏幕快照的右侧看到输出。

这是我为您实施此用例的假人项目的link至最终代码库。

GitHub - haadbaig/NestJS-concepts at multiple-field-query-gql

结论:

我希望这对您有用。通过在多个字段上过滤从数据库查询数据是一项重要的简单而棘手的任务,当堆栈中添加GraphQl时,它变得更加棘手,但是,我相信在阅读本文后,对您来说将变得很容易<<<<<<<<<<<。 /p>

如果您喜欢我的写作,并发现它有用,请与您的研究员分享,并给我发表评论和拍手。也将我连接到我的LinkedIn profile。

您还可以阅读我以前的文章有关使用GraphQl突变上传文件的文章,以下是链接:

Uploading files using GraphQL Client to MongoDB with NestJS / NodeJS