মঙ্গোডিবিতে ডেটা সংস্করণ কার্যকর করার উপায়


298

আপনি কীভাবে মঙ্গোডিবিতে ডেটা সংস্করণ প্রয়োগ করবেন তা আপনার চিন্তাভাবনাগুলি ভাগ করতে পারেন। ( ক্যাসান্দ্রার ব্যাপারে আমি একই ধরণের প্রশ্ন জিজ্ঞাসা করেছি b যদি আপনার কোনও ভাবনা থাকে তবে ডিবি এর জন্য ভাল যা দয়া করে শেয়ার করুন)

মনে করুন যে একটি সাধারণ ঠিকানা বইতে আমার রেকর্ডগুলি সংস্করণ করা দরকার। (অ্যাড্রেস বুকের রেকর্ডগুলি ফ্ল্যাট জেসন অবজেক্ট হিসাবে সংরক্ষণ করা হয়)। আমি আশা করি ইতিহাস:

  • খুব কম ব্যবহার করা হবে
  • এটি একটি "টাইম মেশিন" ফ্যাশনে উপস্থাপন করতে একবারে ব্যবহার করা হবে
  • একক রেকর্ডে কয়েক শতাধিক সংস্করণ থাকবে না। ইতিহাসের মেয়াদ শেষ হবে না।

আমি নিম্নলিখিত পদ্ধতিগুলি বিবেচনা করছি:

  • রেকর্ডগুলির ইতিহাস বা রেকর্ডে পরিবর্তনের ইতিহাস সংরক্ষণ করতে একটি নতুন অবজেক্ট সংগ্রহ তৈরি করুন। এটি অ্যাড্রেস বুক এন্ট্রি সম্পর্কিত একটি রেফারেন্স সহ প্রতি সংস্করণে একটি বস্তু সংরক্ষণ করবে। এই ধরনের রেকর্ডগুলি নীচের মত দেখতে হবে:

    {
     '_id': 'নতুন আইডি',
     'ব্যবহারকারী': ব্যবহারকারী_আইডি,
     'টাইমস্ট্যাম্প': টাইমস্ট্যাম্প,
     'ঠিকানা_বুক_আইডি': 'ঠিকানা বইয়ের রেকর্ডের আইডি' 
     'old_record': {'প্রথম_নাম': 'জন', 'শেষের নাম': 'ডো' ...}
    }
    

    এই নথিটি প্রতি নথি অনুসারে সংস্করণগুলির অ্যারে সঞ্চয় করতে পরিবর্তিত হতে পারে। তবে এটি কোনও সুবিধা ছাড়াই ধীর পদ্ধতির বলে মনে হচ্ছে।

  • ঠিকানা পুস্তিকার এন্ট্রিগুলিতে সিরিয়ালযুক্ত (জেএসএন) বস্তু সংযুক্ত হিসাবে সংস্করণ সঞ্চয় করুন। মোংগোডিবি ডকুমেন্টগুলির সাথে কীভাবে এই জাতীয় জিনিসগুলি সংযুক্ত করা যায় তা আমি নিশ্চিত নই। সম্ভবত স্ট্রিংগুলির একটি অ্যারে হিসাবে। ( কাউচডিবি সহ সাধারণ দস্তাবেজ সংস্করণ পরে মডেলিং )


1
আমি জানতে চাই যে প্রশ্নের উত্তর দেওয়ার পরে এটি পরিবর্তন হয়েছে কিনা? আমি ওপলগ সম্পর্কে খুব বেশি জানি না তবে কি এই সময়ে ছিল, এটি কি কোনও পার্থক্য করবে?
রেন্ডি এল

আমার পদ্ধতিটি হ'ল সময়সীমা হিসাবে সমস্ত ডেটা ভাবা।

উত্তর:


152

এতে ডুব দেওয়ার সময় প্রথম বড় প্রশ্নটি হ'ল "আপনি কীভাবে চেঞ্জসেটগুলি সঞ্চয় করতে চান" ?

  1. Diffs?
  2. পুরো রেকর্ড অনুলিপি?

আমার ব্যক্তিগত দৃষ্টিভঙ্গি বিভিন্নতা সংরক্ষণ করা হবে। যেহেতু এই ভিন্নতাগুলির প্রদর্শনটি সত্যই একটি বিশেষ ক্রিয়া, তাই আমি ভিন্ন একটি "ইতিহাস" সংগ্রহের মধ্যে ডিফগুলি রাখব।

আমি মেমরির স্থান বাঁচাতে বিভিন্ন সংগ্রহটি ব্যবহার করব। আপনি সাধারণ জিজ্ঞাসার জন্য সাধারণত একটি পূর্ণ ইতিহাস চান না। সুতরাং ইতিহাসটিকে বস্তুর বাইরে রাখার মাধ্যমে আপনি যখন তথ্যটি জিজ্ঞাসা করা হয় তখন আপনি এটিকে সাধারণ অ্যাক্সেস করা মেমরি থেকেও দূরে রাখতে পারেন।

আমার জীবনকে সহজ করার জন্য, আমি একটি ইতিহাসের নথিতে সময়-স্ট্যাম্পড ডিফার্সের একটি অভিধান থাকতে চাই। এটার মতো কিছু:

{
    _id : "id of address book record",
    changes : { 
                1234567 : { "city" : "Omaha", "state" : "Nebraska" },
                1234568 : { "city" : "Kansas City", "state" : "Missouri" }
               }
}

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

আপডেট: 2015-10

দেখে মনে হচ্ছে জেএসএন ডিফ্সগুলি পরিচালনা করার জন্য এখন একটি অনুমান রয়েছে । এটি ভিন্নতা / পরিবর্তনগুলি সংরক্ষণ করার আরও শক্তিশালী উপায় বলে মনে হচ্ছে।


2
আপনি কি উদ্বিগ্ন হবেন না যে এই জাতীয় ইতিহাসের নথি (পরিবর্তিত বস্তু) সময় বাড়বে এবং আপডেটগুলি অদক্ষ হয়ে উঠবে? অথবা মংগোডিবি হ্যান্ডলগুলি নথিগুলি সহজেই বৃদ্ধি পায়?
পাইওটার সিজাপলা

5
সম্পাদনাটি একবার দেখুন। যুক্ত করা changesসত্যিই সহজ: db.hist.update({_id: ID}, {$set { changes.12345 : CHANGES } }, true)এটি এমন একটি সম্পাদনা সম্পাদন করবে যা কেবলমাত্র প্রয়োজনীয় ডেটা পরিবর্তন করবে। মঙ্গো এই ধরণের পরিবর্তনটি পরিচালনা করতে "বাফার স্পেস" সহ নথি তৈরি করে। এটি সংগ্রহে থাকা দস্তাবেজগুলি কীভাবে প্রতিটি সংগ্রহের জন্য বাফার আকার পরিবর্তন করে এবং এটিও পর্যবেক্ষণ করে। সুতরাং মঙ্গোডিবি ঠিক এই ধরণের পরিবর্তনের জন্য ডিজাইন করা হয়েছে (নতুন সম্পত্তি যুক্ত করুন / অ্যারেতে পুশ করুন)।
গেটস ভিপি

2
আমি কিছু পরীক্ষা করেছি এবং প্রকৃতপক্ষে স্থান সংরক্ষণগুলি বেশ ভালভাবে কাজ করে। ডেটা ফাইলের শেষে রেকর্ডগুলি পুনরায় স্থানান্তরিত হলে আমি পারফরম্যান্সের ক্ষতিটি ধরতে সক্ষম হইনি।
পাইওটার সিজাপলা

4
আপনার ইতিহাসের জন্য পৃথকীকরণ ( মঙ্গোডিবি সামঞ্জস্যপূর্ণ) তৈরি করতে আপনি github.com/mirek/node-rus-diff ব্যবহার করতে পারেন ।
মিরেক রুসিন

1
তাদেরকে JSON প্যাচ জন্য RFC difffs প্রকাশ করার একটি উপায় প্রদান করে। এটি বিভিন্ন ভাষায় বাস্তবায়ন করেছে ।
Jérôme

31

"ভার্মনগো" নামে একটি সংস্করণ প্রকল্প রয়েছে যা এমন কিছু দিকগুলিকে সম্বোধন করে যা অন্যান্য জবাবগুলিতে মোকাবেলা করা হয়নি।

এই সমস্যাগুলির মধ্যে একটি হ'ল সাম্প্রতিক আপডেট, অন্যটি নথি মুছে ফেলছে ting

ভার্মোঙ্গো ছায়া সংকলনে সম্পূর্ণ নথির অনুলিপি সঞ্চয় করে। কিছু ব্যবহারের ক্ষেত্রে এটি অত্যধিক ওভারহেডের কারণ হতে পারে তবে আমি মনে করি এটি অনেকগুলি বিষয়কেও সরল করে।

https://github.com/thiloplanz/v7files/wiki/Vermongo


5
আপনি আসলে এটি কীভাবে ব্যবহার করবেন?
হাদিস

6
এই প্রকল্পটি আসলে কীভাবে ব্যবহৃত হবে সে সম্পর্কে কোনও দলিল নেই। এটি কি এমন কিছু যা মংগোর সাথে একরকম বেঁচে থাকে? এটি জাভা গ্রন্থাগার? সমস্যাটি কি কেবল চিন্তা করার উপায়? কোন ধারণা এবং কোন ইঙ্গিত দেওয়া হয় না।
ftrotter

1
এটি আসলে একটি জাভা অ্যাপ্লিকেশন এবং রিলেভেন্ট কোড এখানে বাস করে: github.com/thiloplanz/v7files/blob/master/src/main/java/v7db/…
ftrotter

20

বর্তমান সংস্করণ এবং সমস্ত পুরানো সংস্করণগুলির জন্য একটি একক দস্তাবেজ ব্যবহার করে এখানে আরও একটি সমাধান রয়েছে:

{
    _id: ObjectId("..."),
    data: [
        { vid: 1, content: "foo" },
        { vid: 2, content: "bar" }
    ]
}

dataসমস্ত সংস্করণ রয়েছে । dataঅ্যারেটি অর্ডার করা হয়েছে , নতুন সংস্করণগুলি কেবল অ্যারের $pushশেষ দিকে এড পাবে। data.vidসংস্করণ আইডি, যা একটি বর্ধমান সংখ্যা।

অতি সাম্প্রতিক সংস্করণ পান:

find(
    { "_id":ObjectId("...") },
    { "data":{ $slice:-1 } }
)

এর দ্বারা একটি নির্দিষ্ট সংস্করণ পান vid:

find(
    { "_id":ObjectId("...") },
    { "data":{ $elemMatch:{ "vid":1 } } }
)

কেবলমাত্র নির্দিষ্ট ক্ষেত্রগুলি ফেরত দিন:

find(
    { "_id":ObjectId("...") },
    { "data":{ $elemMatch:{ "vid":1 } }, "data.content":1 }
)

নতুন সংস্করণ sertোকান : (এবং সমবর্তী সন্নিবেশ / আপডেট প্রতিরোধ করুন)

update(
    {
        "_id":ObjectId("..."),
        $and:[
            { "data.vid":{ $not:{ $gt:2 } } },
            { "data.vid":2 }
        ]
    },
    { $push:{ "data":{ "vid":3, "content":"baz" } } }
)

2হয় vidবর্তমান সাম্প্রতিকতম সংস্করণ ও 3নতুন সংস্করণ ঢোকানো হচ্ছে। কারণ আপনার যা দরকার সাম্প্রতিকতম সংস্করণ এর vid, এটা পরবর্তী সংস্করণ এর পেতে পারি সহজ vid: nextVID = oldVID + 1

$andশর্ত নিশ্চিত করবে, যে 2সর্বশেষ vid

এইভাবে কোনও অনন্য সূচকের প্রয়োজন নেই, তবে অ্যাপ্লিকেশন লজিকটি vidঅন ​​সন্নিবেশকে বাড়ানোর যত্ন নিতে হবে ।

একটি নির্দিষ্ট সংস্করণ সরান:

update(
    { "_id":ObjectId("...") },
    { $pull:{ "data":{ "vid":2 } } }
)

এটাই!

(প্রতি নথির সীমা 16MB মনে রাখবেন)


এমএমএপিভি 1 স্টোরেজ সহ, প্রতিটি সময়ে ডেটাতে একটি নতুন সংস্করণ যুক্ত করা হয়, ডকুমেন্টটি স্থানান্তরিত হওয়ার সম্ভাবনা রয়েছে।
raok1997

হ্যা, তা ঠিক. তবে আপনি যদি প্রতি একবার মাত্র নতুন সংস্করণ যুক্ত করেন তবে এটি অবহেলাযোগ্য হওয়া উচিত।
বেনিয়ামিন এম

12

আপনি যদি একটি প্রস্তুত টু রোল সমাধান খুঁজছেন -

মঙ্গয়েড সাধারণ সংস্করণে তৈরি করেছে

http://mongoid.org/en/mongoid/docs/extras.html#versioning

মঙ্গোড-ইতিহাস হ'ল একটি রুবি প্লাগইন যা নিরীক্ষণ, পূর্বাবস্থায় ফিরিয়ে আনার সাথে একটি আরও জটিল সমাধান সরবরাহ করে

https://github.com/aq1018/mongoid-history


18
রুবি প্রোগ্রামিং ভাষার জন্য।
ftrotter

9

আমি এই সমাধানটির মাধ্যমে কাজ করেছি যা ডেটাগুলির একটি প্রকাশিত, খসড়া এবং historicalতিহাসিক সংস্করণকে সামঞ্জস্য করে:

{
  published: {},
  draft: {},
  history: {
    "1" : {
      metadata: <value>,
      document: {}
    },
    ...
  }
}

আমি এখানে মডেলটি আরও ব্যাখ্যা করি: http://software.danielwatrous.com/mittedmitted-revision-data-in-mongodb/

যাঁরা জাভাতে এই জাতীয় কিছু বাস্তবায়িত করতে পারেন তাদের উদাহরণ এখানে:

http://software.danielwatrous.com/using-java-to-work-with-versioned-data/

আপনি পছন্দ করেন এমন সমস্ত কোড সহ কাঁটাচামচ করতে পারেন

https://github.com/dwatrous/mongodb-revision-objects


দুর্দান্ত জিনিস :)
জোনাথন


4

আরেকটি বিকল্প হ'ল মঙ্গুজ-ইতিহাস প্লাগইন ব্যবহার করা ।

let mongoose = require('mongoose');
let mongooseHistory = require('mongoose-history');
let Schema = mongoose.Schema;

let MySchema = Post = new Schema({
    title: String,
    status: Boolean
});

MySchema.plugin(mongooseHistory);
// The plugin will automatically create a new collection with the schema name + "_history".
// In this case, collection with name "my_schema_history" will be created.

1

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

nicklozon / উল্কা সংগ্রহের-পুনর্বিবেচনা

অন্য শব্দ বিকল্পটি হল উল্কা ভার্মোঙ্গো ব্যবহার করা ( এখানে )

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