মনগুজ স্কিমাগুলিতে তৈরি_এটি এবং আপডেটড্যাট ক্ষেত্রগুলি যুক্ত করুন


166

কোনও নতুন মাইমোডেল () বলা হয় না, এমন কি কোনও মংগস স্কিমাতে তৈরি_এট এবং আপডেটড্যাট ফিল্ড যুক্ত করার কোনও উপায় আছে?

তৈরি_এটি ক্ষেত্রটি একটি তারিখ হবে এবং কেবলমাত্র একটি নথি তৈরি করা হলে যুক্ত করা হবে added আপডেট_এইট ক্ষেত্রটি নতুন ডেটের সাথে আপডেট করা হবে যখনই কোনও দস্তাবেজে সেভ () বলা হবে।

আমি এটি আমার স্কিমাতে চেষ্টা করেছি, তবে আমি যদি তা সুস্পষ্টভাবে যোগ না করি তবে ক্ষেত্রটি প্রদর্শিত হবে না:

var ItemSchema = new Schema({
    name    : { type: String, required: true, trim: true }
  , created_at    : { type: Date, required: true, default: Date.now }
});

আপনি ঠিক যা করেছেন আমি তা করেছি এবং এটি কাজ করেছে। মঙ্গুজ ব্যবহার করে 4.8.4। একটি নতুন জিনিস হতে পারে?
মার্চাইনওয়ার্ড

1
এটি বেশ কিছুক্ষণ আগে থেকেই ছিল।
chovy

হ্যাঁ, ভেবেছিলেন যে উপরেরগুলি এখন কাজ করে।
মার্টিইনওয়ার্ডে

উত্তর:


132

মঙ্গুজ ৪.০ হিসাবে আপনি এখন স্কিমায় একটি টাইমস্ট্যাম্পস সেট করতে পারেন মঙ্গুজ আপনার জন্য এটি পরিচালনা করতে:

var thingSchema = new Schema({..}, { timestamps: true });

আপনি এর মতো ব্যবহৃত ক্ষেত্রের নাম পরিবর্তন করতে পারেন:

var thingSchema = new Schema({..}, { timestamps: { createdAt: 'created_at' } });

http://mongoosejs.com/docs/guide.html#timestamps


2
সম্মত, এটি মঙ্গুজ ৪.০-এ সেরা বিকল্প।
ট্যাড গাইলস

258

আপডেট: (5 বছর পরে)

দ্রষ্টব্য: আপনি যদি কাপা আর্কিটেকচার ( ইভেন্ট সোর্সিং + সিকিউআরএস ) ব্যবহার করার সিদ্ধান্ত নেন তবে আপনার আপডেটের তারিখের প্রয়োজন হবে না। যেহেতু আপনার ডেটা অপরিবর্তনীয়, কেবলমাত্র সংযুক্ত ইভেন্ট লগ, আপনার কেবল ইভেন্ট তৈরির তারিখ প্রয়োজন। অনুরূপ ল্যামডা আর্কিটেকচার , নীচের বর্ণনা করেছেন। তারপরে আপনার অ্যাপ্লিকেশনের স্থিতি হল ইভেন্ট লগ (উত্পন্ন ডেটা) এর একটি অভিক্ষেপ। আপনি যদি বিদ্যমান সত্তা সম্পর্কে পরবর্তী কোনও ইভেন্টটি পান তবে আপনি সেই ঘটনার তৈরি তারিখটিকে আপনার সত্তার জন্য আপডেটের তারিখ হিসাবে ব্যবহার করবেন। এটি মাইক্রোসরভিস সিস্টেমে একটি সাধারণভাবে ব্যবহৃত (এবং সাধারণত ভুল বোঝাবুঝি) অনুশীলন।

আপডেট: (4 বছর পরে)

আপনি যদি ObjectIdআপনার _idক্ষেত্র হিসাবে ব্যবহার করেন (যা সাধারণত হয়) তবে আপনার যা করতে হবে তা হ'ল:

let document = {
  updatedAt: new Date(),
}

_idক্ষেত্র থেকে তৈরি টাইমস্ট্যাম্প কীভাবে পাবেন তার নীচে আমার মূল উত্তরটি দেখুন । আপনার যদি বাহ্যিক সিস্টেম থেকে আইডি ব্যবহার করতে হয়, তবে রোমান আরএন নেস্টারভের উত্তরটি দেখুন।

আপডেট: (2.5 বছর পরে)

আপনি এখন মংগুজে সংস্করণ> = 4.0 সহ # টাইমস্ট্যাম্পস বিকল্পটি ব্যবহার করতে পারেন ।

let ItemSchema = new Schema({
  name: { type: String, required: true, trim: true }
},
{
  timestamps: true
});

যদি আপনার স্কিমাতে টাইমস্ট্যাম্পস, মঙ্গুজ বরাদ্দ করে createdAtএবং updatedAtক্ষেত্রগুলি সেট করে থাকে তবে নির্ধারিত ধরণটি Date

আপনি টাইমস্ট্যাম্প ফাইল করা নামগুলিও নির্দিষ্ট করতে পারেন:

timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }

দ্রষ্টব্য: আপনি যদি সমালোচনামূলক ডেটা সহ কোনও বড় অ্যাপ্লিকেশনটিতে কাজ করছেন তবে আপনার ডকুমেন্টগুলি আপডেট করার বিষয়ে আপনার পুনর্বিবেচনা করা উচিত। আমি আপনাকে অপরিবর্তনীয়, পরিশিষ্ট-কেবলমাত্র ডেটা ( ল্যাম্বদা আর্কিটেকচার ) দিয়ে কাজ করার পরামর্শ দেব । এর অর্থ হ'ল আপনি কেবলমাত্র প্রবেশের অনুমতি দিন। আপডেট এবং মুছে ফেলার অনুমতি দেওয়া উচিত নয়!আপনি যদি কোনও রেকর্ড "মুছতে" চান, আপনি সহজেই কিছু timestamp/ version দায়ের করা নথির একটি নতুন সংস্করণ inোকাতে এবং তারপরে একটি deletedক্ষেত্র সেট করতে পারেন true। একইভাবে আপনি যদি কোনও দস্তাবেজ আপডেট করতে চান - আপনি উপযুক্ত ক্ষেত্রগুলি আপডেট করে একটি নতুন তৈরি করেন এবং বাকী ক্ষেত্রগুলি অনুলিপি করে থাকেন this তখন এই নথিটি জিজ্ঞাসা করার জন্য আপনি একটি নতুন টাইমস্ট্যাম্প বা সর্বোচ্চ সংস্করণ সহ একটি পাবেন "মুছে ফেলা" (নাdeleted ক্ষেত্রটি অপরিজ্ঞাত বা মিথ্যা `)।

ডেটা অপরিবর্তনীয়তা নিশ্চিত করে যে আপনার ডেটা ডিবাগযোগ্য - আপনি প্রতিটি নথির ইতিহাস সন্ধান করতে পারেন। কিছু ভুল হয়ে গেলে আপনি কোনও নথির পূর্ববর্তী সংস্করণেও রোলব্যাক করতে পারেন। আপনি যদি এই জাতীয় কোনও স্থাপত্যের সাথে যান তবে ObjectId.getTimestamp()আপনার যা প্রয়োজন তা হ'ল এবং এটি মঙ্গুজ নির্ভর নয়।


মূল উত্তর:

আপনি যদি নিজের পরিচয় ক্ষেত্র হিসাবে অবজেক্টআইড ব্যবহার করছেন তবে আপনার ক্ষেত্রের দরকার নেই created_at। অবজেক্টআইডসের একটি পদ্ধতি বলা হয় getTimestamp()

অবজেক্ট-( "507c7f79bcf86cd7994f6c0e")। GetTimestamp ()

এটি নিম্নলিখিত আউটপুট ফেরত দেবে:

ISODate ( "2012-10-15T21: 26: 17Z")

এখানে আরও তথ্য আমি একটি মঙ্গো অবজেক্টআইডি থেকে তৈরি তারিখটি কীভাবে বের করব

updated_atদায়ের করা যুক্ত করতে আপনাকে এটি ব্যবহার করতে হবে:

var ArticleSchema = new Schema({
  updated_at: { type: Date }
  // rest of the fields go here
});

ArticleSchema.pre('save', function(next) {
  this.updated_at = Date.now();
  next();
});

3
আপনি এটি মঙ্গুজ / নোড.জেজে কীভাবে করেন?
জেব্রা প্রপুলশন ল্যাব

6
এটি যে সমাধানটি ব্যবহার হয়ে যায় তা না হলেও, এটি জেনে রাখা মূল্যবান, খুব আকর্ষণীয়!
অগ্রেত

তবে যদি আমি তারিখে তৈরির দৃশ্যটি দেখতে চাই, তবে এর জন্য আমাকে বিশেষ ভেরিয়েবল সেট করতে হবে, বা আইডিটি সঠিকভাবে পাস করতে হবে?

3
আমি প্রাথমিক উত্তরটির প্রশংসা করি তবে ল্যাম্বডা আর্কিটেকচারটি ব্যবহার করার পক্ষে পরামর্শ দেওয়াও 5x স্তর মেটা সমস্যার সমাধান করার দুর্দান্ত উপায় বলে মনে হয় এবং সিআরইউডি অ্যাপ্লিকেশনটি তৈরির পরিবর্তে এবং কখনই সহজ রাখার পরিবর্তে এই পদ্ধতির জটিলতা সত্যায়িত না হওয়া পর্যন্ত সরবরাহ করা সম্ভব হয় না। মনে রাখবেন আপনি মোঙ্গোডিবি সম্পর্কে পোস্ট করছেন যা 'সবে' স্কেলের সাথে শুরু হয় এবং আপনি প্রতিটি লেখার জন্য একটি নতুন রেকর্ডের পক্ষে পরামর্শ দিচ্ছেন যা মঙ্গোকে দ্রুত কোনও অর্থবহ স্কেলে হত্যা করবে। এটি ক্যাসান্দ্রা বিভাগে সরান ...
জন কালভিনার

1
এই উত্তরে প্রদত্ত তথ্যের জন্য ধন্যবাদ, সত্যিকারের মুছে ফেলার জায়গায় নরম মুছে ফেলতে আমি আসলে আমার ব্যাকএন্ড ডিজাইনটি পরিবর্তন করেছি। এটি এমন কিছু গভীর জ্ঞান সরবরাহ করে যা সত্যই কার্যকর।
কেননা

133

এটিই আমি শেষ করেছিলাম:

var ItemSchema = new Schema({
    name    : { type: String, required: true, trim: true }
  , created_at    : { type: Date }
  , updated_at    : { type: Date }
});


ItemSchema.pre('save', function(next){
  now = new Date();
  this.updated_at = now;
  if ( !this.created_at ) {
    this.created_at = now;
  }
  next();
});

8
১. বর্তমান সময়টিকে স্থানীয় ভেরায় সংরক্ষণ করুন এবং প্রত্যেকবার নতুন তারিখ () কল করার পরিবর্তে এটি নির্ধারণ করুন, এটি নিশ্চিত করবে যে প্রথম পাসে তৈরি_এট এবং আপডেটেড_এটের পাসের একই মান রয়েছে। 2. নতুন তারিখ => নতুন তারিখ ()
শাই এরলিচম্যান

13
কেবল উল্লেখ করতে চাই যে আপনি যদি অবজেক্টআইডি ব্যবহার করেন তবে আপনি সেখান থেকে তৈরি_এটি পেতে পারেন .... আপনার আলাদা ক্ষেত্রের দরকার নেই। চেক আউট করুনgetTimestamp()
জেরি

6
তৈরি_এটের জন্য অন্যান্য বিকল্প হতে পারে -> তৈরি_আট: {টাইপ: তারিখ, ডিফল্ট: তারিখ.নো},
অস্কারভিজিজি

1
@ আজব্রাস একটি স্কিমা প্লাগইন তৈরি করুন
উইলিংকে

2
স্থির পদ্ধতি হিসাবে এটির Date.now()পরিবর্তে যেখানে সম্ভব new Dateতার পরিবর্তে এটিও ব্যবহার করুন
কার্লকুজারজার

107

timestampsআপনার স্কিমার জন্য অন্তর্নির্মিত বিকল্পটি ব্যবহার করুন।

var ItemSchema = new Schema({
    name: { type: String, required: true, trim: true }
},
{
    timestamps: true
});

এটি স্বয়ংক্রিয়ভাবে আপনার স্কিমাতে যুক্ত হবে createdAtএবং updatedAtক্ষেত্রগুলি।

http://mongoosejs.com/docs/guide.html#timestamps


1
মঙ্গুজের সংস্করণ প্রয়োজন> = 4.0
জেনসেন

2
আমি দস্তাবেজগুলি অস্পষ্ট দেখতে পেয়েছি - এটি ক্ষেত্রগুলি যুক্ত করে, তবে এটিও প্রতিটি আপডেটে আপডেট হওয়া নিশ্চিত করে?
লুড্বিক

সাধারণত, তৈরি করা সর্বদা শুধুমাত্র একবারে সংরক্ষণ করা হয় ... যখন বস্তুটি তৈরি করা হয়। updatedAtপ্রতিটি নতুন সংরক্ষণে আপডেট করা হয় (যখন
বস্তুটি

1
আমি এই "2016-12-07T11: 46: 46.066Z" পেয়েছি .. সময় স্ট্যাম্প ফর্ম্যাটটি ব্যাখ্যা করতে পার, সময় অঞ্চল কীভাবে পরিবর্তন করবেন ?? mongoDB সার্ভারের সময় অঞ্চল গ্রহণ করা হয় ??
মহেশ কে

@ এমকম্পো, উত্তরের জন্য আপনাকে ধন্যবাদ! আমি জানি এটি একটি দীর্ঘ শট, তবে আপনি কি কোনও সুযোগেই মনে রাখতে পারেন যদি এইভাবে তৈরি করা ক্ষেত্রগুলি সূচক হিসাবে ব্যবহার করা যায়?
ম্যানিডোস

29

যদি ব্যবহার update()বাfindOneAndUpdate()

সঙ্গে {upsert: true}বিকল্প

তুমি ব্যবহার করতে পার $setOnInsert

var update = {
  updatedAt: new Date(),
  $setOnInsert: {
    createdAt: new Date()
  }
};

1
এটি বেশিরভাগ মঙ্গো লাইব্রেরিতে কাজ করে। গৃহীত উত্তরে পরিবর্তন
chovy

1
আপনি যদি মোগোর ডিফল্ট _idক্ষেত্র ব্যবহার করে থাকেন তবে আপনার কোনও createdAtক্ষেত্রের দরকার নেই । আরও তথ্যের জন্য নীচে আমার উত্তর চেক করুন।
পাভেল নিকোলভ

1
... আমার মূল উত্তরটি পরীক্ষা করে দেখুন ।
পাভেল নিকোলভ

25

যোগ timestampsআপনার টু Schemaতারপর এই মত createdAtএবং updatedAtআপনার জন্য স্বয়ংক্রিয় উত্পন্ন করবে

var UserSchema = new Schema({
    email: String,
    views: { type: Number, default: 0 },
    status: Boolean
}, { timestamps: {} });

এখানে চিত্র বর্ণনা লিখুন
এছাড়াও আপনি createdAt -> created_atদ্বারা পরিবর্তন করতে পারেন

timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }

2
এখন যে মঙ্গুজ আপনার জন্য এই সমস্ত কাজ করে, আমি সম্মতি জানাই যে এটি এখন সেরা সমাধান the
ভিন্স বাউডরেন 14


8

এইভাবে আমি তৈরি এবং আপডেট করে অর্জন করেছি।

আমার স্কিমার অভ্যন্তরে আমি এর মতো তৈরি এবং আপডেট করেছি:

   / **
     * আর্টিকেল স্কিমা
     * /
    var ArticleSchema = নতুন স্কিমা ({
        তৈরি করা হয়েছে:
            প্রকার: তারিখ,
            ডিফল্ট: তারিখ.নো
        },
        আপডেট হয়েছে: {
            প্রকার: তারিখ,
            ডিফল্ট: তারিখ.নো
        },
        শিরোনাম: {
            প্রকার: স্ট্রিং,
            ডিফল্ট: '',
            ছাঁটাই: সত্য,
            প্রয়োজনীয়: 'শিরোনাম ফাঁকা হতে পারে না'
        },
        সামগ্রী::
            প্রকার: স্ট্রিং,
            ডিফল্ট: '',
            ছাঁটাই: সত্য
        },
        ব্যবহারকারী:
            প্রকার: স্কিমা.অবজেক্টআইডি,
            রেফ: 'ব্যবহারকারী'
        }
    });

তারপরে নিবন্ধ নিয়ন্ত্রকের অভ্যন্তরে আমার নিবন্ধ আপডেট পদ্ধতিতে আমি যুক্ত করেছি:

/ **
     * একটি নিবন্ধ আপডেট করুন
     * /
    निर्यात.আপডেট = ফাংশন (পুনরায়, পুনরায়) {
        var নিবন্ধ = req.article;

        নিবন্ধ = _.ষধি (নিবন্ধ, req.body);
        আর্টিকেল.সেট ("আপডেট", তারিখ.নো ());

        নিবন্ধ.সেভ (ফাংশন (ভুল))
            যদি (ভুল) {
                রিসেট স্টেটাস (400)। বিক্রয় ({
                    বার্তা: errorHandler.getErrorMessage (ত্রুটি)
                });
            } অন্য {
                res.json (নিবন্ধ);
            }
        });
    };

সাহসী বিভাগগুলি আগ্রহের অংশ।



4

যে কোনও স্কিমায় এই আচরণটি যুক্ত করতে আপনি timestampপ্লাগইনটি ব্যবহার করতে পারেন mongoose-troop


3

আপনি এই প্লাগইনটি খুব সহজেই ব্যবহার করতে পারেন। ডক্স থেকে:

var timestamps = require('mongoose-timestamp');
var UserSchema = new Schema({
    username: String
});
UserSchema.plugin(timestamps);
mongoose.model('User', UserSchema);
var User = mongoose.model('User', UserSchema)

আপনি যদি চান তবে ক্ষেত্রের নামও সেট করুন:

mongoose.plugin(timestamps,  {
  createdAt: 'created_at', 
  updatedAt: 'updated_at'
});

2

আমরা স্কিমা প্লাগইন ব্যবহার করে এটি অর্জন করতে পারি

ইন helpers/schemaPlugin.jsফাইল

module.exports = function(schema) {

  var updateDate = function(next){
    var self = this;
    self.updated_at = new Date();
    if ( !self.created_at ) {
      self.created_at = now;
    }
    next()
  };
  // update date for bellow 4 methods
  schema.pre('save', updateDate)
    .pre('update', updateDate)
    .pre('findOneAndUpdate', updateDate)
    .pre('findByIdAndUpdate', updateDate);
};

এবং models/ItemSchema.jsফাইলটিতে:

var mongoose = require('mongoose'),
  Schema   = mongoose.Schema,
  SchemaPlugin = require('../helpers/schemaPlugin');

var ItemSchema = new Schema({
  name    : { type: String, required: true, trim: true },
  created_at    : { type: Date },
  updated_at    : { type: Date }
});
ItemSchema.plugin(SchemaPlugin);
module.exports = mongoose.model('Item', ItemSchema);

2

আপনার মডেল স্কিমাতে, কেবল একটি অ্যাট্রিবিউট টাইমস্ট্যাম্প যুক্ত করুন এবং প্রদর্শিত মান হিসাবে এটির জন্য সত্য নির্ধারণ করুন : -

var ItemSchema = new Schema({
   name :  { type: String, required: true, trim: true },
},{timestamps : true}
);

এটা কি করবে?
chovy

টাইমস্ট্যাম্প অ্যাট্রিবিউট প্রতিটি নথিতে তৈরি_এটি এবং আপডেটড্যাট ফিল্ড যুক্ত করবে। Created_at ক্ষেত্রটি নথি তৈরির সময় এবং আপডেট_এটি ক্ষেত্রটি অন্য কোনও নথির তৈরির সময় আপডেটের সময়কে নির্দেশ করে। উভয় ক্ষেত্রের মান আইএসও সময় বিন্যাসে। আশা করি এটি আপনার সন্দেহগুলি পরিষ্কার করবে Ch
23:57

1
const mongoose = require('mongoose');
const config = require('config');
const util = require('util');

const Schema = mongoose.Schema;
const BaseSchema = function(obj, options) {
  if (typeof(options) == 'undefined') {
    options = {};
  }
  if (typeof(options['timestamps']) == 'undefined') {
    options['timestamps'] = true;
  }

  Schema.apply(this, [obj, options]);
};
util.inherits(BaseSchema, Schema);

var testSchema = new BaseSchema({
  jsonObject: { type: Object }
  , stringVar : { type: String }
});

এখন আপনি এটি ব্যবহার করতে পারেন, যাতে প্রতিটি টেবিলের মধ্যে এই বিকল্পটি অন্তর্ভুক্ত করার প্রয়োজন না হয়


1

আমার মঙ্গুজ সংস্করণটি 4.10.2

মনে হচ্ছে কেবল হুকই findOneAndUpdateকাজ work

ModelSchema.pre('findOneAndUpdate', function(next) {
  // console.log('pre findOneAndUpdate ....')
  this.update({},{ $set: { updatedAt: new Date() } });
  next()
})

0

গণিত ডিফল্ট মানটি ফেরত দিতে একটি ফাংশন ব্যবহার করুন:

var ItemSchema = new Schema({
    name: {
      type: String,
      required: true,
      trim: true
    },
    created_at: {
      type: Date,
      default: function(){
        return Date.now();
      }
    },
    updated_at: {
      type: Date,
      default: function(){
        return Date.now();
      }
    }
});

ItemSchema.pre('save', function(done) {
  this.updated_at = Date.now();
  done();
});

কোনও Date.now()ক্রিয়াকলাপে মোড়ানোর দরকার নেই কেবল:...default: Date.now()
কার্লকুরজার

1
আমি এটিকে একটি ফাংশনে আবদ্ধ করি যাতে আমি পরীক্ষাগুলিতে '.নো ()' উপহাস করতে পারি। অন্যথায় এটি আরম্ভের সময় কেবল একবার চালানো হয় এবং মানটি সহজেই পরিবর্তন করা যায় না।

1
নোট যে default: Date.now()ভুল হবে। যদি কিছু হয় default: Date.now। অন্যথায় আপনার সমস্ত নথির একই টাইমস্ট্যাম্প থাকবে: আপনার অ্যাপ্লিকেশন শুরু হওয়ার সময়;)
ম্যাক্স ট্রুকসা

আমি আপনার default: Date.nowকৌশল পছন্দ। অনেক ক্লিনার

0

আমি আসলে এটি পিছনে করি

আপডেটের সাথে যদি সব কিছু ঠিকঠাক হয়:

 // All ifs passed successfully. Moving on the Model.save
    Model.lastUpdated = Date.now(); // <------ Now!
    Model.save(function (err, result) {
      if (err) {
        return res.status(500).json({
          title: 'An error occured',
          error: err
        });
      }
      res.status(200).json({
        message: 'Model Updated',
        obj: result
      });
    });

0

ডেটটাইম ফর্ম্যাট করতে মেশিনপ্যাক-ডেটটাইম ব্যবহার করুন।

tutorialSchema.virtual('createdOn').get(function () {
    const DateTime = require('machinepack-datetime');
    let timeAgoString = "";
    try {
        timeAgoString = DateTime.timeFrom({
            toWhen: DateTime.parse({
                datetime: this.createdAt
            }).execSync(),
            fromWhen: new Date().getTime()
        }).execSync();
    } catch(err) {
        console.log('error getting createdon', err);
    }
    return timeAgoString; // a second ago
});

এক্সপ্রেস বা সাধারণ জাভাস্ক্রিপ্ট বিশ্বের থেকে পৃথক স্পষ্ট এপিআই সহ মেশিন প্যাক দুর্দান্ত।


-2

আপনি মিডলওয়্যার এবং ভার্চুয়াল ব্যবহার করতে পারেন । আপনার updated_atক্ষেত্রের জন্য এখানে একটি উদাহরণ রয়েছে :

ItemSchema.virtual('name').set(function (name) {
  this.updated_at = Date.now;
  return name;
});

এটি কখন সেট হবে? এবং এটা কি স্থির থাকবে? সুতরাং এখন থেকে 3 দিন, এখনও 3 দিন আগে থেকে একটি তারিখ থাকবে?
chovy

এই ক্ষেত্রে আপনি যখনই প্রদত্ত সম্পত্তি পরিবর্তন করবেন তখন ভার্চুয়ালকে ডাকা হবে name। এবং হ্যাঁ, এটি অধ্যবসায়ী হওয়া উচিত।
zemirco

এটি আইটেম অবজেক্টে সমস্ত ক্ষেত্রে কাজ করবে? আমি নিশ্চিত না যে এই সমাধানটি আমি যা চাই তা করি
chovy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.