<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MD ARIFUL HASAN</title>
    <description>The latest articles on DEV Community by MD ARIFUL HASAN (@arifulhasantotul).</description>
    <link>https://dev.to/arifulhasantotul</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F771291%2F3f4b5a14-ee66-4a56-a943-ae4e7ec74b2b.jpg</url>
      <title>DEV Community: MD ARIFUL HASAN</title>
      <link>https://dev.to/arifulhasantotul</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arifulhasantotul"/>
    <language>en</language>
    <item>
      <title>Filter and Result (AWS Amplify, AppSync, GraphQL)</title>
      <dc:creator>MD ARIFUL HASAN</dc:creator>
      <pubDate>Mon, 18 Jul 2022 04:37:08 +0000</pubDate>
      <link>https://dev.to/arifulhasantotul/filter-and-result-aws-amplify-appsync-graphql-3mhd</link>
      <guid>https://dev.to/arifulhasantotul/filter-and-result-aws-amplify-appsync-graphql-3mhd</guid>
      <description>&lt;p&gt;In this post, we'll try to understand how to search/filter and result work in AWS Amplify and AppSync.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites:
&lt;/h2&gt;

&lt;p&gt;1/ GraphQL &lt;a href="https://graphql.org/learn/" rel="noopener noreferrer"&gt;Learn&lt;/a&gt;&lt;br&gt;
2/ Data modeling &lt;br&gt;
If you don't know about data modeling check out my previous blog about &lt;a href="https://dev.to/arifulhasantotul/data-modeling-aws-amplify-appsync-graphql-4l0n"&gt;data-modeling&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've no idea about any prerequisites, I recommend learning them highly.&lt;/p&gt;

&lt;h1&gt;
  
  
  Directives
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;@modal @auth @hasOne @hasMany @manyToMany @searchable @primaryKey @index&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@searchable&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Needs to setup ElasticSearch (We'll not do this in this post)&lt;/li&gt;
&lt;li&gt;Active search and sorting at the same time.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;other directives&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;I've briefly described other directives in the data-modeling blog. If you don't know about other directives &lt;a href="https://dev.to/arifulhasantotul/data-modeling-aws-amplify-appsync-graphql-4l0n"&gt;click here&lt;/a&gt; to learn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Data Types
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Scalar type: id, name, date_of_birth, got_job, gpa etc. (which has scalar value like ID, String, Float, Int, Boolean, AWSDate etc.)&lt;/li&gt;
&lt;li&gt;Object type: Status, Student ( which is a javascript object)&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl45arsmzyosjk19fj4tv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl45arsmzyosjk19fj4tv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Supported Search Operations
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Type&lt;/th&gt;
&lt;th&gt;Supported operations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;ne, eq, match, matchPhrase, matchPhrasePrefix, multiMatch, exists, wildcard, regexp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Int&lt;/td&gt;
&lt;td&gt;ne, gt, lt, gte, lte, eq, range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Float&lt;/td&gt;
&lt;td&gt;ne, gt, lt, gte, lte, eq, range&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;ne, eq&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enum&lt;/td&gt;
&lt;td&gt;ne, eq, match, matchPhrase, matchPhrasePrefix, multiMatch, exists, wildcard, regexp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;not supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;ne (not equal), eq (equal), gt (greater than), lt (lesser than), gte (greater than or equal), lte (lesser than or equal)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Without &lt;code&gt;@searchable&lt;/code&gt; directive
&lt;/h1&gt;

&lt;p&gt;We can do filter with or without &lt;code&gt;@searchable&lt;/code&gt; directive.We'll get &lt;strong&gt;filter&lt;/strong&gt; argument for every list resolvers like (listStudents, listStatuses etc.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to the DOCS or Documentation Explorer, and now search for the list resolver name you want to apply the filter. Click on any list resolver you want to apply filter. Here we're clicking on the &lt;strong&gt;liststudents&lt;/strong&gt; resolver to apply the filter.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2ms59gxbuh71lys3gof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2ms59gxbuh71lys3gof.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inside &lt;strong&gt;listStudents&lt;/strong&gt; we get the &lt;strong&gt;filter argument&lt;/strong&gt;. Click on the filter argument to see what conditions we can apply to filter out data.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1paagnfgnwmv4zql8web.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1paagnfgnwmv4zql8web.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inside &lt;strong&gt;filter argument&lt;/strong&gt;, we can see multiple fields that can use to filter out data. If we pay attention to argument fields, we see that all the filter options are available only for the &lt;strong&gt;scalar field&lt;/strong&gt;. No object fields are available like &lt;strong&gt;status&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8al11wqe7vxkwjnqxi8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8al11wqe7vxkwjnqxi8s.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Dummy data for testing:
&lt;/h1&gt;

&lt;p&gt;We've created some data to test filtering. If you don't know how to add a document/data in database or how hasOne, hasMany, manyToMany relation works, I suggest you to check out the &lt;a href="https://dev.to/arifulhasantotul/data-modeling-aws-amplify-appsync-graphql-4l0n"&gt;data-modeling&lt;/a&gt; blog. Now we'll apply filter on this below data&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;{&lt;br&gt;
  "data": {&lt;br&gt;
    "listStudents": {&lt;br&gt;
      "items": [&lt;br&gt;
        {&lt;br&gt;
          "id": "9f928a7a-f096-4ad8-b0cc-5b354dde6b18",&lt;br&gt;
          "name": "Raisa",&lt;br&gt;
          "email": "&lt;a href="mailto:raisa@gmail.com"&gt;raisa@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.7,&lt;br&gt;
          "got_job": true,&lt;br&gt;
          "statusID": "b3a4a939-50ed-4d3c-a21e-8048834391f5",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": true,&lt;br&gt;
            "is_passed": false&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-07-17",&lt;br&gt;
          "exam_completed": 2&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "31092e63-e421-4bbc-afe8-f2092e309442",&lt;br&gt;
          "name": "Ashim",&lt;br&gt;
          "email": "&lt;a href="mailto:ashim@gmail.com"&gt;ashim@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.2,&lt;br&gt;
          "got_job": false,&lt;br&gt;
          "statusID": "2cc614a4-0bd1-4a8d-80a8-bc0c8372788b",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": false,&lt;br&gt;
            "is_passed": true&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-04-15",&lt;br&gt;
          "exam_completed": 3&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "9a3a92df-e4be-4258-ae02-502e0bfd3745",&lt;br&gt;
          "name": "Hasan",&lt;br&gt;
          "email": "&lt;a href="mailto:hasan@gmail.com"&gt;hasan@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.4,&lt;br&gt;
          "got_job": false,&lt;br&gt;
          "statusID": "840a91da-75ce-4cd5-8a41-58081763a933",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": true,&lt;br&gt;
            "is_passed": false&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-03-22",&lt;br&gt;
          "exam_completed": 1&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "ff173ed6-5749-4a54-903b-025675f828e5",&lt;br&gt;
          "name": "Minhaj",&lt;br&gt;
          "email": "&lt;a href="mailto:minhaj@gmail.com"&gt;minhaj@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.7,&lt;br&gt;
          "got_job": true,&lt;br&gt;
          "statusID": "e1f9ccc1-132f-443a-9f37-821ed634cfc1",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": true,&lt;br&gt;
            "is_passed": false&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-04-21",&lt;br&gt;
          "exam_completed": 3&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "bc70feab-da91-4ba5-a626-ee99c9f4c4a0",&lt;br&gt;
          "name": "Totul",&lt;br&gt;
          "email": "&lt;a href="mailto:totul@gmail.com"&gt;totul@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.4,&lt;br&gt;
          "got_job": false,&lt;br&gt;
          "statusID": "ca9064ff-5c2f-4634-8dca-d12f10acd1db",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": false,&lt;br&gt;
            "is_passed": true&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-03-29",&lt;br&gt;
          "exam_completed": 1&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "514b1115-7c95-4037-884f-4d5eae58dc4b",&lt;br&gt;
          "name": "Mahadhi",&lt;br&gt;
          "email": "&lt;a href="mailto:mahadhi@gmail.com"&gt;mahadhi@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.6,&lt;br&gt;
          "got_job": true,&lt;br&gt;
          "statusID": "ec2d4c20-4022-4084-9d52-19ec2cd18503",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": false,&lt;br&gt;
            "is_passed": true&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1993-07-21",&lt;br&gt;
          "exam_completed": 4&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "7054f363-3f3c-4343-9dff-f7e4491a797f",&lt;br&gt;
          "name": "Shuvo",&lt;br&gt;
          "email": "&lt;a href="mailto:shuvo@gmail.com"&gt;shuvo@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 2.5,&lt;br&gt;
          "got_job": false,&lt;br&gt;
          "statusID": "1958dea4-59b4-4766-b725-476747b8b4c3",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": false,&lt;br&gt;
            "is_passed": true&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-02-15",&lt;br&gt;
          "exam_completed": 2&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "bf74457b-a1e4-4715-880f-1425bedaaa09",&lt;br&gt;
          "name": "Ayesha",&lt;br&gt;
          "email": "&lt;a href="mailto:ayesha@gmail.com"&gt;ayesha@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.5,&lt;br&gt;
          "got_job": false,&lt;br&gt;
          "statusID": "3a86016e-b0d6-479f-a1d1-1effa0846457",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": true,&lt;br&gt;
            "is_passed": false&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-07-17",&lt;br&gt;
          "exam_completed": 2&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "a2e5e97d-5f8d-493e-ba78-1701ca08d58e",&lt;br&gt;
          "name": "Arif",&lt;br&gt;
          "email": "&lt;a href="mailto:arif@gmail.com"&gt;arif@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.51,&lt;br&gt;
          "got_job": true,&lt;br&gt;
          "statusID": "840a91da-75ce-4cd5-8a41-58081763a933",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": true,&lt;br&gt;
            "is_passed": false&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1998-03-27",&lt;br&gt;
          "exam_completed": 1&lt;br&gt;
        },&lt;br&gt;
        {&lt;br&gt;
          "id": "485b3f5a-8709-4902-82a6-4997c6a0839a",&lt;br&gt;
          "name": "Navin",&lt;br&gt;
          "email": "&lt;a href="mailto:navin@gmail.com"&gt;navin@gmail.com&lt;/a&gt;",&lt;br&gt;
          "gpa": 3.4,&lt;br&gt;
          "got_job": false,&lt;br&gt;
          "statusID": "0e437cee-92f6-418a-bf90-af74a67a9943",&lt;br&gt;
          "status": {&lt;br&gt;
            "is_enrolled": true,&lt;br&gt;
            "is_passed": false&lt;br&gt;
          },&lt;br&gt;
          "date_of_birth": "1993-06-24",&lt;br&gt;
          "exam_completed": 3&lt;br&gt;
        }&lt;br&gt;
      ]&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Using of filter argument: Filtering students by got_job&lt;br&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;got_job{ eq: $job }: Go to the documentation explorer and click on the **got_job&lt;/strong&gt; field, we'll see some conditions with types like (eq: Boolean, ne: Boolean, etc.) &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;$job: Boolean&lt;/strong&gt;: Specify the input value type because we can only match with boolean data according to &lt;strong&gt;eq: Boolean&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmrf52nmuwsawk4elkhd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmrf52nmuwsawk4elkhd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Using of filter argument: Filtering students by gpa
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;gpa{ ge: $point }&lt;/strong&gt;: Go to the documentation explorer and click on the &lt;strong&gt;gpa&lt;/strong&gt; field, we'll see some conditions with types like (ne: Float, ge: Float, eq: Float, etc.) We're using &lt;strong&gt;ge&lt;/strong&gt; condition and its value is &lt;strong&gt;Float&lt;/strong&gt;. That's why we've to take the float value&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;$point: Float&lt;/strong&gt;: Specify the input value type because we can only match with float number according to &lt;strong&gt;ge: Float&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vwfrhui95ppja313mm3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vwfrhui95ppja313mm3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Using of nested filter argument: Filtering students by gpa and got_job
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Here we can use &lt;strong&gt;and / or / not&lt;/strong&gt; operations. By default, &lt;strong&gt;and&lt;/strong&gt; operation is applied on the query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;got_job : {eq: $job}, {exam_completed: {le: $exam}}&lt;/strong&gt;: Data will show when got_job and exam_completed both satisfy conditions&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxmybcgbys7q94w19h6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxmybcgbys7q94w19h6s.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Using of nested filter argument: Filtering students by got_job and exam_completed/email
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;got_job : {eq: $job}, or: [{exam_completed: {gt: $exam}}, {email: {eq: $email}}]&lt;/strong&gt;: Data will show when got_job and exam_completed/email both satisfy conditions.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpn05m44cyyndpu65ziqs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpn05m44cyyndpu65ziqs.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Using of limit &amp;amp; nextToken argument: Limiting data for pagination
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;$limit: Int&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The limit argument takes an Integer value and gives a certain amount of data. &lt;/li&gt;
&lt;li&gt;Here we're providing the limit value 2. So the query will return a maximum of 2 documents/data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;$token: String&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The nextToken argument takes a String value and gives the upcoming documents/data. &lt;/li&gt;
&lt;li&gt;Here we're providing an empty string in the argument because we need all data available in the first. &lt;/li&gt;
&lt;li&gt;We're also getting a nextToken string from the query field that will provide us with the upcoming data. If the nextToken value is &lt;strong&gt;null&lt;/strong&gt;, that means we've no data left.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzwcbjhmbq6ezbo72xki.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;$limit: Int&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Here we're providing the limit value 2. So the query will return a maximum of 2 documents/data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;$token: String&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the nextToken string from the previous query and provide it in the nextToken argument field to get upcoming documents/data.&lt;/li&gt;
&lt;li&gt;We're also getting a new nextToken string from the query field that will provide us with the upcoming data.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw72e22r256j5acrd5b9b.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Using of filter &amp;amp; limit &amp;amp; nextToken arguments:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;We've already described all the conditions briefly, so now we will only visualize/understand the process.&lt;br&gt;
&lt;strong&gt;Step-1| nextToken: ""&lt;/strong&gt;:&lt;br&gt;
If the nextToken is an empty string, the limit process will start from 1st item/element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-2| limit: 2&lt;/strong&gt;:&lt;br&gt;
The limit process will select 1st &amp;amp; 2nd item/element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-3| filter: condition&lt;/strong&gt;:&lt;br&gt;
The filter process will check the 1st &amp;amp; 2nd item/element. If the filter condition satisfy, we will get the matched element. Here the condition matches with one element.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hunxyxiktwl5envwr6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hunxyxiktwl5envwr6h.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-1| nextToken: ""&lt;/strong&gt;:&lt;br&gt;
If we provide a nextToken which we got from the previous query. The limit process will start from the upcoming item. Here the upcoming item starts from 3rd item/element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-2| limit: 2&lt;/strong&gt;:&lt;br&gt;
The limit process will select 3rd &amp;amp; 4th item/element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-3| filter: condition&lt;/strong&gt;:&lt;br&gt;
The filter process will check the 3rd &amp;amp; 4th item/element. If the filter condition satisfy, we will get the matched element. Here the condition matches with both elements.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfafikp6zcle6yqr6nuc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfafikp6zcle6yqr6nuc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Que: Here we are filtering data based on the student scalar field. What if we want to filter data based on student status (student object field)?
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Solution:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Step-1: The connection between the Student model and the Status model is hasOne relation. We've to create a bi-directional relationship between the Student model and the Status model to get the Student data inside the Status model. If you don't understand relations between different models, check out this &lt;a href="https://dev.to/arifulhasantotul/data-modeling-aws-amplify-appsync-graphql-4l0n"&gt;blog&lt;/a&gt; or feel free to comment below.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlv472j5xf2r0z9xdue1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlv472j5xf2r0z9xdue1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step-2: We've created a bi-directional relationship between both models. But if we don't update documents one by one, we'll get a null value. To get the student data inside the status table, we've to update every status providing status id in $id field and student id in $student_id field.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sqis2aqt3s5pj54zzq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sqis2aqt3s5pj54zzq5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step-3: Get filtered data of enrolled students.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvovcqqh66iwwtl5aem0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvovcqqh66iwwtl5aem0s.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  With &lt;code&gt;@searchable&lt;/code&gt; directive
&lt;/h2&gt;

&lt;p&gt;By adding @searchable we get some extra operations&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aggregation values, such as sum, average, min, max terms&lt;/li&gt;
&lt;li&gt;retrieve total search result count&lt;/li&gt;
&lt;li&gt;sort the search results across one or multiple fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To work the @searchable directive properly, we've to setup OpenSearch, and that's for another blog&lt;/p&gt;

&lt;p&gt;That's it for now. Thanks for your patience. If this blog help you please give a react.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>amplify</category>
      <category>appsync</category>
      <category>graphql</category>
    </item>
    <item>
      <title>Data Modeling (AWS amplify, AppSync, GraphQL)</title>
      <dc:creator>MD ARIFUL HASAN</dc:creator>
      <pubDate>Fri, 17 Jun 2022 09:03:40 +0000</pubDate>
      <link>https://dev.to/arifulhasantotul/data-modeling-aws-amplify-appsync-graphql-4l0n</link>
      <guid>https://dev.to/arifulhasantotul/data-modeling-aws-amplify-appsync-graphql-4l0n</guid>
      <description>&lt;p&gt;Before going to the data modeling we need to create the graphQL API.&lt;br&gt;
Go to the link to create &lt;a href="https://docs.amplify.aws/lib/graphqlapi/getting-started/q/platform/js/" rel="noopener noreferrer"&gt;the graphQL API&lt;/a&gt;&lt;br&gt;
This may looks time consuming. But if you're new to Data Modeling give it a shot. You're basic will be far more then clear.&lt;/p&gt;

&lt;p&gt;Before start creating schema we've to know about some directives we're going to use while creating graphQL schema. And if don't have any idea about what GraphQL is then get some basic about &lt;a href="https://graphql.org/learn/" rel="noopener noreferrer"&gt;GraphQl&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Directives
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;@model @auth @hasOne @hasMany @belongTo @manyToMany @searchable @primaryKey and @index ....&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@model&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Store objects in DynamoDB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure CRUD resolvers&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@auth&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;API authorization strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@hasOne, @hasMany, @manyToMany, @belongsTo&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Create relationships between @model &lt;code&gt;object types&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@searchable&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Active search and sorting at the same time from database.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;@primaryKey, @index&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Override default key property with custom data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Modeling
&lt;/h2&gt;

&lt;p&gt;Now we're going to setup database tables using API(GraphQL)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Data types&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scalar type: title, content (Contains scalar value like ID, String, Int, Float, DateTime etc.)&lt;/li&gt;
&lt;li&gt;Object type: Todo (which is a JavaScript Object)&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tmzoexpdlqnw4ht0l2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tmzoexpdlqnw4ht0l2l.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Without &lt;code&gt;@model&lt;/code&gt; directive, we'll not get any CRUD resolvers &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Few0dld8txsaqe4n5y34j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Few0dld8txsaqe4n5y34j.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;&lt;code&gt;@model&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By adding &lt;code&gt;@model&lt;/code&gt; directive we will get all the CRUD resolvers &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tmlys7gg5js17ehfkod.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tmlys7gg5js17ehfkod.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resolvers&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;getTodo&lt;/td&gt;
&lt;td&gt;Get one todo document using &lt;code&gt;id&lt;/code&gt; or &lt;code&gt;primaryKey&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;listTodo&lt;/td&gt;
&lt;td&gt;Get all todo documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;createTodo&lt;/td&gt;
&lt;td&gt;Insert one todo document&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updateTodo&lt;/td&gt;
&lt;td&gt;Update one todo document using &lt;code&gt;id&lt;/code&gt; or &lt;code&gt;primaryKey&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deleteTodo&lt;/td&gt;
&lt;td&gt;Delete one todo document using &lt;code&gt;id&lt;/code&gt; or &lt;code&gt;primaryKey&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn20veks5gdcidwkw04wk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn20veks5gdcidwkw04wk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;&lt;code&gt;@auth&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By adding &lt;code&gt;@auth&lt;/code&gt; directive we will get the permission to use CRUD resolvers. Otherwise we might get an error about unauthorization.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuosq0uhraujgu9ai01y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuosq0uhraujgu9ai01y.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;createTodo, updateTodo, deleteTodo&lt;/code&gt; To create, update &amp;amp; delete a document in DB, we've to start the query with &lt;strong&gt;&lt;code&gt;mutation&lt;/code&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createTodo&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id: id is auto generated &lt;/li&gt;
&lt;li&gt;title: title comes from &lt;code&gt;input&lt;/code&gt; object &lt;code&gt;title&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;content: content comes from &lt;code&gt;input&lt;/code&gt; object &lt;code&gt;content&lt;/code&gt; field
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ie6ddvl1fg73buys3n4.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;getTodo, listTodo&lt;/code&gt; To get a document or all documents, the best practice is to start the query with &lt;strong&gt;&lt;code&gt;query&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;getTodo&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id: Provide id to get a document from DB.&lt;/li&gt;
&lt;li&gt;title, content data will come from DB 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqik8phjy7aomunj99azy.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;listTodos&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id: Don't need id to get data&lt;/li&gt;
&lt;li&gt;title, content &amp;amp; other propertise will come from DB
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfar5n0261dndm8yyzca.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;deleteTodo&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id: Provide id to delete match document&lt;/li&gt;
&lt;li&gt;whole document object will delete from DB
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb0lu9ot1zb0c4x10685.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;&lt;code&gt;@index&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By using secondary index or &lt;code&gt;@index&lt;/code&gt; directive we can create another extra queryField&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To use &lt;strong&gt;&lt;code&gt;todoByTitleAndRank&lt;/code&gt;&lt;/strong&gt; we've to provide title as argument in the query field&lt;/li&gt;
&lt;li&gt;To use &lt;strong&gt;&lt;code&gt;todoByRank&lt;/code&gt;&lt;/strong&gt; we've to provide rank as argument in the query field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pedhvjr1mm2043ro49w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pedhvjr1mm2043ro49w.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fickm6n3g8863wf5iojho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fickm6n3g8863wf5iojho.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup relationships between models
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directive&lt;/th&gt;
&lt;th&gt;Data flow&lt;/th&gt;
&lt;th&gt;Relationship&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hasOne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One-directional&lt;/td&gt;
&lt;td&gt;one-to-one&lt;/td&gt;
&lt;td&gt;A project "has one" team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hasMany&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One-directional&lt;/td&gt;
&lt;td&gt;one-to-many&lt;/td&gt;
&lt;td&gt;A post "has many" comments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@belongsTo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bi-directional&lt;/td&gt;
&lt;td&gt;one-to-one or one-to-many&lt;/td&gt;
&lt;td&gt;A project has one team or a team belongs to a project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@ManyToMany&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bi-directional&lt;/td&gt;
&lt;td&gt;many-to-many&lt;/td&gt;
&lt;td&gt;A blog has many tags and a tag has many blogs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;&lt;code&gt;@hasOne&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjgd3xbo7ccb68fgi23p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjgd3xbo7ccb68fgi23p.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-directional :&lt;/strong&gt; We'll get child object inside of a parent object. Below here Child object is Team and Parent object is Project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-one :&lt;/strong&gt; We'll get only one child inside of a parent object.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;createTeam&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;teamName: Provide team name
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8smhidkq3evwjh88g7j5.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createProject&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;projectName: Provide project name&lt;/li&gt;
&lt;li&gt;projectTeamId: Provide the exact same id of Team. This default field will be created and matched with the team id field &amp;amp; get the team data. We can override this field.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73644hbh3a1rbkhfzcqj.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;listProjects&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team data will be found if projectTeamId === team.id.&lt;/li&gt;
&lt;li&gt;We'll get team data inside of project.&lt;/li&gt;
&lt;li&gt;But if we try to get project data inside of team it'll give us an error.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fffcg6opujfu8fljx81pw.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;@hasOne(fields: ["fieldName"])&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This will override the default field (projectTeamId) by fieldName (teamID). We will not find the default field again.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7ukzfbfenu4lxg9teti.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Now instead of matching projectTeamId === team.id, it is matching teamID === team.id.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6peqecm0sdr5h19tphnw.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;&lt;code&gt;@hasMany&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi78z45mdkltauim8r43e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi78z45mdkltauim8r43e.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-directional :&lt;/strong&gt; We'll get array of child objects inside of a parent object. Below here Child object is Comment and Parent object is Post&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-many :&lt;/strong&gt; We'll get one or more child inside of a parent object.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;createPost&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;postName: Provide post title
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp7gdpsy6onznowghq8g.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createComment&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;commentContent: Provide comment string&lt;/li&gt;
&lt;li&gt;postCommentsId: Provide the exact same id of Post. This default field will be created and matched with the Post id field &amp;amp; get the comment data. We can override this field.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0q6pt31gh2ojwu4j077j.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Adding another comment
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43o62edv3b66bwry1qdb.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;listPosts&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comments will be found if postCommentsId === post.id&lt;/li&gt;
&lt;li&gt;We'll get array of comment  inside of post.&lt;/li&gt;
&lt;li&gt;But if we try to get post data inside of comments it'll give us an error.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6zdjrwg4mhwbicsb7fl.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;@hasMany(indexName: "byPost", fields: ["id"]) &lt;br&gt;
postID: ID! @index(name: "byPost", sortKeyFields: ["content"]&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This will override the default field (postCommentsId) by property of index (postID). We will not find the default field again.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpx42d2985ei5m20b297y.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Adding post
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7lnazwtfu9gjjo65i4qv.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Adding comment 1&lt;/li&gt;
&lt;li&gt;postID: Provide the exact same id of Post. This field will override the postCommentsId field and match the Post id field &amp;amp; get the comment data.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0m4rtsazgni7az9b1br.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Adding comment 2
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpvkirizh4polxdclt17.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Now instead of matching postCommentsId === post.id, it is matching postID === post.id.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52lrebwohagz6c3nuvli.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;&lt;code&gt;@belongsTo&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dr3qptqynnba2imc3e8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dr3qptqynnba2imc3e8.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bi-directional :&lt;/strong&gt; We'll get array of child objects inside of a parent object &amp;amp; we'll also get parent inside of. Below here Child object is Comment and Parent object is Post&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difference&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directive&lt;/th&gt;
&lt;th&gt;Can be found child data inside parent object&lt;/th&gt;
&lt;th&gt;Can be found parent data inside child object&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hasOne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hasMany&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@belongsTo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;I'm explaining &lt;code&gt;@belongsTo&lt;/code&gt; directive for &lt;code&gt;@hasMany&lt;/code&gt; relation. You should try out &lt;code&gt;@belongsTo&lt;/code&gt; directive for &lt;code&gt;@hasOne&lt;/code&gt; relation. There is no change in creating &lt;code&gt;@hasOne&lt;/code&gt; and &lt;code&gt;@hasMany&lt;/code&gt; schema and data table.Just we will find parent data inside of a child object.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;createPost&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide postName
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qd4qp094ocraz36gm6a.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createComment&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating relation between two table by postCommentsId
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pw6w2lqu4hzp7h9y3mu.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Add comment 2
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xq7ez01nyd8l60o9yyj.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;listPost&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting child (comments) data inside parent (post) object&lt;/li&gt;
&lt;li&gt;Getting parent (post) data inside child (comments) object
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8o50oucio3xmfrgonafi.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;@hasMany(indexName: "byPost", fields: ["id"]) &lt;br&gt;
postID: ID! @index(name: "byPost")&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This will override the default field (postCommentsId) by property of index (postID). We will not find the default field again.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkiyenqea15hvesjznzq9.png" alt="Image description"&gt;
&lt;strong&gt;&lt;code&gt;createPost&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Provide postName
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu01xmbev93m66kan8p2j.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createComment&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;postID: Provide the exact same id of Post. This field will override the postCommentsId field and match the Post id field &amp;amp; get the comment data.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7nqoow6kka6iz7dl9ewl.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;li&gt;Adding comment 2
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyhdobd2je5ijjsplkvq.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;listPost&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting child (comments) data inside parent (post) object&lt;/li&gt;
&lt;li&gt;Getting parent (post) data inside child (comments) object
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sgq82svkpji5nnbck3k.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  7. &lt;strong&gt;&lt;code&gt;@manyToMany&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2cjb3thaq88gqyt9nko9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2cjb3thaq88gqyt9nko9.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This relation will create 3 data table.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Table&lt;/th&gt;
&lt;th&gt;get&lt;/th&gt;
&lt;th&gt;list&lt;/th&gt;
&lt;th&gt;create&lt;/th&gt;
&lt;th&gt;update&lt;/th&gt;
&lt;th&gt;delete&lt;/th&gt;
&lt;th&gt;subscription&lt;/th&gt;
&lt;th&gt;Found Data Object&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Post&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Post, Tag, PostTags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Tag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Post, Tag, PostTags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostTags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Post, Tag, PostTags&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bi-directional :&lt;/strong&gt; We'll get one table inside of another table.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;createPost&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;postName: Provide post name to create a post.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo80c2wd27pw9hvykatji.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;create Tag&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;label: Provide label title to create a tag label.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfzbc1cgi76ravopk4nl.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createPostTags&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
postID: Use to provide post object.&lt;br&gt;
tagID: Use to provide tag object.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0n0s5uuj8288mmx3eh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0n0s5uuj8288mmx3eh3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Advanced
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Create multiple relationships between multiple model&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kfn4rrz0ss9yf2hi8si.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kfn4rrz0ss9yf2hi8si.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Relations between models are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Department has one manager and many employees&lt;/li&gt;
&lt;li&gt;Manager has one department and many employees&lt;/li&gt;
&lt;li&gt;Employees has one department and one manager&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;createDepartment&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide Department name in the departmentName input&lt;/li&gt;
&lt;li&gt;We don't have manager and employee id. So we'll update the department later.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpunt3flyb1nx33zfcpk.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createManager&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide manager name  in the managerName input&lt;/li&gt;
&lt;li&gt;Provide department id in the departmentID input.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9r68udb8o34ewkurouc.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;createEmployee&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide employee name in the employeeName input&lt;/li&gt;
&lt;li&gt;Provide department id in the departmentID input.&lt;/li&gt;
&lt;li&gt;Provide manager id in the managerID input.&lt;/li&gt;
&lt;li&gt;And we're getting department and manager info in the Employee table
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8zel0llxoibnxpc4m32.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;updateDepartment&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide selected department id in the id input&lt;/li&gt;
&lt;li&gt;Provide manager id in the managerID input&lt;/li&gt;
&lt;li&gt;and we're getting employee and manager info in department table.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9y7145za5vulbgy1kn7.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;listManagers&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;And we're getting department and employee info in manager table.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstrurdey8gwxg67su1nw.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it for now. Thanks for your patience. If this blog help you please give  a react.&lt;br&gt;
Next &lt;a href="https://dev.to/arifulhasantotul/filter-and-result-aws-amplify-appsync-graphql-3mhd"&gt;blog&lt;/a&gt; will be about filtering...&lt;/p&gt;

</description>
      <category>aws</category>
      <category>graphql</category>
      <category>appsync</category>
      <category>amplify</category>
    </item>
    <item>
      <title>Single and multiple images upload and remove from Cloudinary using Node JS, Multer, MongoDB</title>
      <dc:creator>MD ARIFUL HASAN</dc:creator>
      <pubDate>Wed, 23 Feb 2022 07:30:02 +0000</pubDate>
      <link>https://dev.to/arifulhasantotul/single-and-multiple-images-upload-and-remove-from-cloudinary-using-node-js-multer-mongodb-1p2h</link>
      <guid>https://dev.to/arifulhasantotul/single-and-multiple-images-upload-and-remove-from-cloudinary-using-node-js-multer-mongodb-1p2h</guid>
      <description>&lt;p&gt;This system is working without using the file system of node. And I'm also using Thunder client (VS Code extension) for sending request, but you can also use Postman.&lt;/p&gt;

&lt;p&gt;First create an ordinary Node JS application.&lt;/p&gt;

&lt;p&gt;This is my folder structure and package.json file. I will be using these packages to do the work.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefvqny3j4czi6nbnrx4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefvqny3j4czi6nbnrx4h.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://cloudinary.com" rel="noopener noreferrer"&gt;Cloudinary&lt;/a&gt; and create a free account. After creating an account, you will find CLOUDINARY_NAME, CLOUDINARY_API_KEY, CLOUDINARY_API_SECRET in your account dashboard.&lt;/p&gt;

&lt;p&gt;1# .env file&lt;br&gt;
=&amp;gt; This file will contain all of the secret you don't want to show others&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytfdmqbp34x7yayaa6j4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fytfdmqbp34x7yayaa6j4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2# cloudinary.js file&lt;br&gt;
=&amp;gt; Connects your application to cloudinary. Remember to use &lt;strong&gt;&lt;em&gt;dotenv&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7h18dulq28y7bxikolao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7h18dulq28y7bxikolao.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3# cloudinaryAccountStorage.js file&lt;br&gt;
=&amp;gt; This file will create a seperate folder to store all of your images in Cloudinary.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69vrbqhodvr1t1wcy4fk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69vrbqhodvr1t1wcy4fk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4# people.js file&lt;br&gt;
=&amp;gt; People schema and people model for mongoose to store data in DB.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxiairi3u2h9ztuw9z6uk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxiairi3u2h9ztuw9z6uk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5# message.js file&lt;br&gt;
=&amp;gt; Message schema and message model for mongoose to store data in DB.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmtnjsnntga4lwb0dugq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmtnjsnntga4lwb0dugq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6# server.js file&lt;br&gt;
=&amp;gt; Every file is connected here. Remember to import and use &lt;strong&gt;&lt;em&gt;dotenv&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj00722u6tfleij3fwkwj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj00722u6tfleij3fwkwj.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7# uploadRouter.js file&lt;br&gt;
=&amp;gt; Main routing file of this application. Send different request to different path.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ko8fealpw4qywtxd995.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ko8fealpw4qywtxd995.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8# imageUploader.js file&lt;br&gt;
=&amp;gt; Universal image uploader file. Maximum file size, maximum file number, file type, and validation can control using this function.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fna04ivpa1zz810i8679s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fna04ivpa1zz810i8679s.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9# avatarUpload.js file&lt;br&gt;
=&amp;gt; Sending params to imageUploader.js for file size, file number and file type with error message. Most of the tutorial uses upload.single(), upload.array(), upload.fields() but I'm using upload.any()() to give you some idea how it works&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0fngw2igy0fwdohdega.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0fngw2igy0fwdohdega.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10# attachmentUpload.js file&lt;br&gt;
=&amp;gt; Sending params to imageUploader.js for file size, file number and file type with error message. Most of the tutorial uses upload.single(), upload.array(), upload.fields() but I'm using upload.any()() to give you some idea how it works&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rbjwb2k5es5jawruoh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rbjwb2k5es5jawruoh3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11# uploadController.js file&lt;br&gt;
=&amp;gt; Structure and async function name of controller function. This file control upload and remove images from Cloudinary. It also sends json data to database.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrvec6fa2wdoxngbprrh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrvec6fa2wdoxngbprrh.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.1# addUser function of uploadController.js&lt;br&gt;
=&amp;gt; Upload single image to Cloudinary and send public_id, secure_url to database of cloudinary upload.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3fdtgtt7anlczsvr5qd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs3fdtgtt7anlczsvr5qd.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Result of addUser function&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dc94fzwhltpgoj2fpul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dc94fzwhltpgoj2fpul.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.2# deleteUser function of uploadController.js&lt;br&gt;
=&amp;gt; Remove single image from Cloudinary also remove from database.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F290kcf3q8mwjwy6hwglf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F290kcf3q8mwjwy6hwglf.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Result of deleteUser function&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qbbs19fsf42n0ur2sz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qbbs19fsf42n0ur2sz3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.3# sendMessage function of uploadController.js&lt;br&gt;
=&amp;gt; Upload multiple images to Cloudinary and send public_id, secure_url to database as an object of different cloudinary upload.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30px4n9010btma9duqtu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30px4n9010btma9duqtu.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Result of sendMessage function&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgs00abzwsr3msx61v1xw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgs00abzwsr3msx61v1xw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.4# removeMsgAndAttachments function of uploadController.js&lt;br&gt;
=&amp;gt; Remove multiple images from Cloudinary also remove from database.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc008j5xb2tvsy1jemum8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc008j5xb2tvsy1jemum8.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Result of removeMsgAndAttachments function&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmruuw1gdk06ew48bdjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmruuw1gdk06ew48bdjz.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/arifulhasantotul/node_mongodb_cloudinary_multer_uploadanddelete" rel="noopener noreferrer"&gt;Git repo&lt;/a&gt; of this code.&lt;br&gt;
Thank you all.&lt;/p&gt;

</description>
      <category>node</category>
      <category>mongodb</category>
      <category>cloudinary</category>
      <category>multer</category>
    </item>
  </channel>
</rss>
