<?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: Salim Al Sazu</title>
    <description>The latest articles on DEV Community by Salim Al Sazu (@salimalsazu).</description>
    <link>https://dev.to/salimalsazu</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%2F964255%2Fd704d8bd-955f-4a42-a586-9ad07f0c1a24.jpeg</url>
      <title>DEV Community: Salim Al Sazu</title>
      <link>https://dev.to/salimalsazu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/salimalsazu"/>
    <language>en</language>
    <item>
      <title>রিডাক্সে মাধ্যমে এরেতে ডাটা পাঠানো ।</title>
      <dc:creator>Salim Al Sazu</dc:creator>
      <pubDate>Sun, 08 Oct 2023 05:32:00 +0000</pubDate>
      <link>https://dev.to/salimalsazu/riddaakse-maadhyme-erete-ddaattaa-paatthaano--1fmn</link>
      <guid>https://dev.to/salimalsazu/riddaakse-maadhyme-erete-ddaattaa-paatthaano--1fmn</guid>
      <description>&lt;p&gt;এই খানে দুইটি ওয়ে নিয়ে আলোচনা করবো, একটি immutable ওয়ে আরেকটি হল Mutable ওয়ে ।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ql1yq9su--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vd3eeo43u6avy6tecls4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ql1yq9su--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vd3eeo43u6avy6tecls4.png" alt="Image description" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;১ম ঊদাহরনঃ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;``addToProduct: (state, action) =&amp;gt; {&lt;/p&gt;

&lt;p&gt;state.products = [...state.products, action.payload]&lt;/p&gt;

&lt;p&gt;}``&lt;/p&gt;

&lt;p&gt;এখানে addToProduct নামে একটা ফাংশন নিয়ে এর ভিতর দুইটি প্যারামিটার নেওয়া হয়েছে state এবং action নামে । তারপর Initial state এ যে products ছিলো সেটা কল করে ...state.products  স্প্রেড অপারেটর চালানো হয়েছে । যদি আগে থেকে কোন প্রডাক্ট থাকে তাহলে সে গুলোকে নিয়ে নতুন এরে দেখাও তারপর action.payload থেকে নতুন প্রডাক্ট এড করে দাও।&lt;/p&gt;

&lt;p&gt;এই পদ্ধতি হচ্ছে immutable  ওয়ে । এই পদ্ধতির অনেক গুলো ভালো দিক হচ্ছে আগের স্টেত মডিফাই করে না, খুব সহজে ডিভাগ করা যায় এবং কি কি পরিবর্তন হচ্ছে তা বুঝা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;এখন ২য় উদাহরণ নিয়ে আলোচনা করবোঃ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;``addToProduct: (state, action) =&amp;gt; {&lt;/p&gt;

&lt;p&gt;state.products.push(action.payload)&lt;/p&gt;

&lt;p&gt;}``&lt;/p&gt;

&lt;p&gt;এখানে আগের মতো সব কিছু নেওয়া হয়েছে শুধু state.products এর ভিতর action.payload কে পুশ করে দেওয়া হয়েছে । এটা mutated পদ্ধতি । এটা আগের এরেকে চেঞ্জ করে দেয়, এবং কি কি পরিবর্তন হয়েছে তা ট্রেক করা কঠিন হয়ে পরে।&lt;/p&gt;

&lt;p&gt;পরিশেষে বলা যায় দুইভাবে আমরা রিডাক্সের এর মাধ্যমে এরেতে কোন কোন কিছু এড করতে পারবো । তবে ভালো প্রেটিক্স হল  immutable ওয়েতে হেন্ডেল করা।&lt;/p&gt;

&lt;p&gt;ধন্যবাদ&lt;/p&gt;

&lt;p&gt;সেলিম আল সাজু&lt;/p&gt;

</description>
      <category>redux</category>
      <category>reducer</category>
    </item>
    <item>
      <title>Handle Same key Validation</title>
      <dc:creator>Salim Al Sazu</dc:creator>
      <pubDate>Thu, 08 Jun 2023 12:23:27 +0000</pubDate>
      <link>https://dev.to/salimalsazu/handle-same-key-validation-56aa</link>
      <guid>https://dev.to/salimalsazu/handle-same-key-validation-56aa</guid>
      <description>&lt;p&gt;ধরি কোন প্রাপার্টি যদি আগে থেকেই থাকে তাহলে সেটা পুনরায় আবার এন্ট্রি দেওয়া যাবে না, এর জন্য একটা Validation করতে হবে। কোন ইউজার যদি এড করতে চায় তাহলে সে একটা এরর থ্রূ দেখতে পাবে। &lt;/p&gt;

&lt;p&gt;ধরি ডাটাবেসে একটা অব্জেক্ট আছে এরকমঃ&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
”name”: “Salim Al Sazu”,&lt;/p&gt;

&lt;p&gt;"position": “Web Developer”&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;সেইম নামে আরেকটা যদি পোস্ট করতে চাই তাহলে সে এরর দিবে। এখন কোডে আসা যাকঃ&lt;/p&gt;

&lt;p&gt;এখন এই ভ্যালিডেশনটা আমরা কোথায় করবো, রাউটারে, কন্ট্রলারে নাকি সার্ভিসে ? না মডেলে …… ? &lt;/p&gt;

&lt;p&gt;মঙ্গুজে দুই ধরনের হুক আছে একটা প্রি আরেকটা পোস্ট, প্রি মানে ডাটা সেভ করার আগে চেক করে আর পোস্ট ডাঁটা সেভ করার পর। &lt;/p&gt;

&lt;p&gt;এখন প্রি হুক দিয়ে চেক করে নিবো যদি কোন ডাটা না থেকে তাহলে পোস্ট করবে, না হলে এরর থ্র করবে । &lt;/p&gt;

&lt;p&gt;নরমালি যেভাবে স্কিমা নেওয়া হিয় সেভাবে একটা স্কিমা নিবোঃ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const UserSchema= new Schema(
  {
    name: {
      type: String,
      required: true,
    },
    position: {
      type: String,
      required: true,
    }
  },
  {
    timestamps: true,
  }
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;স্কিমা নেওয়া হিয়ে গেলে সেটার উপর মঙ্গুজ এর pre-hook  চালাবোঃ&lt;/p&gt;

&lt;p&gt;যেহেতু স্কিমা নেইম UserSchema তাহলে এটা দিয়ে pre ফাংশন বলে দিবো UserSchema.pre() তারপর pre  এর ভিতর 'save', async function { }নিবো । এই ফাংশনের ভিতর isExist ভ্যারিয়েবল নিয়ে একটা findOne চালাবো মডেলের নাম এর উপর (মডেলের কোড নিচে দেওয়া আছে )। &lt;/p&gt;

&lt;p&gt;findOne বলে দিবো যদি এই ডাটা গুলো খুজে বের করো এইভাবে findOne({&lt;br&gt;
    name: this.name,&lt;br&gt;
    position: this.position,&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;খুজে বের করা পর একটা কন্ডিশিন দিবো যদি এই গুলো  &lt;/p&gt;

&lt;p&gt;তারপর একটা কন্ডিশন দিবো যদি এই গুলো  isExist করে তাহলে এরর দাও কনফ্লিক্ট এর ।  &lt;/p&gt;

&lt;p&gt;if (isExist) {&lt;br&gt;
    throw new Error(409, 'User is Already Exist');&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;আর যদি কনফ্লিক্ট না করে তাহলে  next() ফাংশন চলে যাও , যা মঙ্গুজের আরেকটা হুক , এক্সপ্রেস এর নয় ।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UserSchema.pre('save', async function (next) {
  const isExist = await Users.findOne({
    name: this.name,
    position: this.position,
  });

  if (isExist) {
    throw new Error(409, 'User is Already Exist');
  }
  next();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এখন যদি লিখা হয়ে যায় তাহলে  মডেল  যেভাবে লিখে সেভাবে লিখে ফেলবোঃ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;UserSchema&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;মডেল ক্রিয়েট হওয়ার আগে আমাদের সেইম ডাটা আছে কি না তা চেক করা লাগবে তাই প্রি হুক মডেলের উপরে ইউজ করা হয়েছে। যদি মডেলের পরে ব্যবহার করা হয় তাহলে সে চ্যাক না করে সেইম ডাটা পাঠিয়ে দিবে। &lt;/p&gt;

&lt;p&gt;এখানে সার্ভিস, কন্ট্রলার , রাউট এই গুলো জানা আছে বিদায় আমরা সেইম ডাটা এরর হ্যনাডেলিং নিয়ে আলোচনা করেছি তা এই গুলো নিয়ে এখানে কথা বলা হয় নাই।&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>mongoose</category>
    </item>
    <item>
      <title>Explore $lookup operator</title>
      <dc:creator>Salim Al Sazu</dc:creator>
      <pubDate>Fri, 26 May 2023 06:52:09 +0000</pubDate>
      <link>https://dev.to/salimalsazu/explore-lookup-operator-18cb</link>
      <guid>https://dev.to/salimalsazu/explore-lookup-operator-18cb</guid>
      <description>&lt;p&gt;প্রথমে দুইটি কালেকশন নিয়ে নেই, &lt;/p&gt;

&lt;p&gt;একটি salim1 =&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "_id": ObjectId("646f441324e5cc15f7f1ee0c"),
    "name": "salim al sazu",
    "email": "sazusalim@gmail.com",
    "class": "X"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;আরেকটি  salim2 =&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "_id": ObjectId("646f485a24e5cc15f7f1ee10"),
    "userEmail": "sazusalim@gmail.com",
    "roll": "546545423",
    "marks": {
        "bangla": 100
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এদের উপর $lookup চালাবো । &lt;/p&gt;

&lt;p&gt;একটা ডাটাবেস থেকে আরেকটা ডাটাবেসে কোন একটা ফিক্সড প্রপার্টির মাধ্যমে কানেক্ট করে যখন অন্যান্য ডাটা গুলো নিয়ে আসা হয় তখন লুক আপ বলে। &lt;/p&gt;

&lt;p&gt;যেমনঃ আমরা ইমেল দিয়ে তা করতে পারি। &lt;/p&gt;

&lt;p&gt;এই জিনিসটা আমরা খুব সহজে এগ্রিগেট এর মাধ্যমে করতে পারি। প্রথমে //db.salim1.aggregate([]) নিয়ে এর ভিতর  { $match:{}} নিবো, কারণ মেইল দিয়ে তা ম্যাচ করাবো। &lt;/p&gt;

&lt;p&gt;এখন আমাকে  {$lookup: {}} চালাতে হবে । &lt;/p&gt;

&lt;p&gt;লুক আপ এর ভিতর প্রথমে from: "salim2" কালেকশন নাম দিবো, যে কালেকশন থেকে আমি ডাটা নিয়ে আসবো। &lt;/p&gt;

&lt;p&gt;তারপর  যে কালেকশনের উপর এগ্রিগেট চালানো হয়েছে সেই কালেকশনের email প্রপার্টি হবে localField আর অন্য আরেকটি কালেকশন থেকে অর্থাৎ “salim2” থেকে যে ডাটা নিয়ে আসতেছি  তার ইমেল প্রাপার্টি হবে foreignField । এর প্রপার্টি নাম দিবো userEmail বা যা নাম থাকবে সেই নাম দিবো । সর্বশেষে  as ব্যবহার হবে কারণ ডাটা গুলো কি নামে সেভ হবে তাই এখানে "examResult" ব্যবহার করা হয়েছে । examResult নামে একটা প্রাপার্টি এড হবে এবং এর ভিতর ডাটা গুলো অব্জেক্ট থাকবে । &lt;/p&gt;

&lt;p&gt;আমরা চাইলে localField: "_id",  এবং foreignField: "userId", ব্যবহার করতে পারি। &lt;/p&gt;

&lt;p&gt;যদি $lookup চালাইঃ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;///db.salim1.aggregate([
    {$match: {email:"sazusalim@gmail.com"}},
    {$lookup: {
          from: "salim2",
          localField: "email",
          foreignField: "userEmail",
          as: "examResult"
         }}
    ])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;রিজেল্ট পাবো এই ভাবেঃ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;///{
    "_id": ObjectId("646f441324e5cc15f7f1ee0c"),
    "name": "salim al sazu",
    "email": "sazusalim@gmail.com",
    "class": "X",
    "examResult": [
        {
            "_id": ObjectId("646f485a24e5cc15f7f1ee10"),
            "email": "sazusalim@gmail.com",
            "roll": "546545423",
            "marks": {
                "bangla": 100
            }
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ধন্যবাদ ! &lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>mongoose</category>
    </item>
  </channel>
</rss>
