MongoDB में डेटा संस्करण को लागू करने के तरीके


298

क्या आप अपने विचारों को साझा कर सकते हैं कि आप MongoDB में डेटा संस्करण कैसे लागू करेंगे। (मैंने कैसंड्रा के संबंध में इसी तरह का प्रश्न पूछा है । यदि आपके पास कोई विचार है जो डीबी बेहतर है तो कृपया साझा करें)

मान लीजिए कि मुझे एक साधारण पते की पुस्तक में रिकॉर्ड बनाने की आवश्यकता है। (पता पुस्तिका रिकॉर्ड फ्लैट जोंस ऑब्जेक्ट के रूप में संग्रहीत किए जाते हैं)। मुझे उम्मीद है कि इतिहास:

  • बार-बार उपयोग किया जाएगा
  • इसे "टाइम मशीन" फैशन में पेश करने के लिए एक साथ सभी का उपयोग किया जाएगा
  • एक ही रिकॉर्ड में कुछ सौ से अधिक संस्करण नहीं होंगे। इतिहास समाप्त नहीं होगा।

मैं निम्नलिखित दृष्टिकोणों पर विचार कर रहा हूं:

  • अभिलेखों के इतिहास या अभिलेखों में परिवर्तन को संग्रहीत करने के लिए एक नया ऑब्जेक्ट संग्रह बनाएं। यह पता पुस्तिका प्रविष्टि के संदर्भ में प्रति संस्करण एक वस्तु संग्रहित करेगा। ऐसे रिकॉर्ड निम्नानुसार दिखाई देंगे:

    {
     '_id': 'नई आईडी',
     'उपयोगकर्ता': user_id,
     'टाइमस्टैम्प': टाइमस्टैम्प,
     'address_book_id': 'एड्रेस बुक रिकॉर्ड की आईडी' 
     'old_record': {'first_name': 'Jon', 'last_name': 'Doe' ...}
    }
    

    इस दृष्टिकोण को प्रति दस्तावेज़ संस्करणों की एक सरणी को संग्रहीत करने के लिए संशोधित किया जा सकता है। लेकिन ऐसा लगता है कि यह बिना किसी फायदे के धीमा है।

  • पुस्तक प्रविष्टियों को क्रमबद्ध (JSON) ऑब्जेक्ट के रूप में स्टोर किए गए संस्करण। मुझे यकीन नहीं है कि इस तरह की वस्तुओं को MongoDB दस्तावेजों में कैसे संलग्न किया जाए। शायद तार की एक सरणी के रूप में। ( CouchDB के साथ सरल दस्तावेज़ संस्करण के बाद बनाया गया )


1
मैं जानना चाहता हूं कि क्या इस सवाल के जवाब के बाद से इसमें बदलाव आया है? मुझे अफीम के बारे में ज्यादा जानकारी नहीं है, लेकिन इस समय के आसपास था, क्या इससे कोई फर्क पड़ेगा?
रैंडी एल

मेरा दृष्टिकोण एक समय श्रृंखला के रूप में सभी डेटा के बारे में सोचना है।

जवाबों:


152

इसमें डुबकी लगाते समय पहला बड़ा सवाल यह है कि "आप कैसे परिवर्तन स्टोर करना चाहते हैं" ?

  1. Diffs?
  2. पूरे रिकॉर्ड की प्रतियां?

मेरा व्यक्तिगत दृष्टिकोण भिन्नता रखने के लिए होगा। क्योंकि इन डिफरेंसेस का प्रदर्शन वास्तव में एक विशेष क्रिया है, मैं डिस्क्स को एक अलग "इतिहास" संग्रह में रखूँगा।

मैं मेमोरी संग्रह को बचाने के लिए विभिन्न संग्रह का उपयोग करूंगा। आप आम तौर पर एक साधारण क्वेरी के लिए एक पूर्ण इतिहास नहीं चाहते हैं। तो इतिहास को ऑब्जेक्ट से बाहर रखकर आप इसे उस डेटा के क्वेर होने पर आमतौर पर एक्सेस की गई मेमोरी से बाहर रख सकते हैं।

मेरे जीवन को आसान बनाने के लिए, मैं एक इतिहास दस्तावेज बनाऊंगा जिसमें समय-मुद्रांकित अंतर का एक शब्दकोश हो। कुछ इस तरह:

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

अपने जीवन को वास्तव में आसान बनाने के लिए, मैं अपने डेटाओबजेक्ट्स (EntityWrapper, जो भी हो) का यह हिस्सा बनाऊंगा जिसका उपयोग मैं अपने डेटा तक पहुंचने के लिए करता हूं। आम तौर पर इन वस्तुओं का इतिहास कुछ रूप में होता है, ताकि आप save()एक ही समय में इस बदलाव को करने के लिए आसानी से विधि को ओवरराइड कर सकें ।

अद्यतन: 2015-10

ऐसा लगता है कि अब JSON भिन्नता से निपटने के लिए एक युक्ति है । यह डिफरेंसेस / चेंजेज को स्टोर करने के लिए अधिक मजबूत तरीका लगता है।


2
क्या आप चिंता नहीं करेंगे कि इस तरह के इतिहास दस्तावेज़ (परिवर्तन वस्तु) समय में बढ़ेगा और अपडेट अक्षम हो जाएंगे? या MongoDB हैंडल दस्तावेज़ आसानी से बढ़ता है?
पायोत्र सीज़ाप्ला

5
संपादन पर एक नज़र डालें। इसमें जोड़ना changesवास्तव में आसान है: db.hist.update({_id: ID}, {$set { changes.12345 : CHANGES } }, true)यह एक ऐसा प्रदर्शन करेगा जो केवल आवश्यक डेटा को बदल देगा। इस प्रकार के परिवर्तन को संभालने के लिए मोंगो "बफर स्पेस" के साथ दस्तावेज बनाता है। यह भी देखता है कि संग्रह में दस्तावेज़ कैसे बदलते हैं और प्रत्येक संग्रह के लिए बफर आकार को संशोधित करता है। तो MongoDB बिल्कुल इस प्रकार के परिवर्तन के लिए डिज़ाइन किया गया है (नई संपत्ति जोड़ें / सरणी में धक्का)।
गेट्स वीपी

2
मैंने कुछ परीक्षण किया है और वास्तव में अंतरिक्ष आरक्षण बहुत अच्छी तरह से काम करता है। जब डेटा फ़ाइल के अंत में रिकॉर्ड्स पुनः प्राप्त किए गए थे, तो मैं प्रदर्शन हानि को पकड़ने में सक्षम नहीं था।
पायोत्र सीज़ापला

4
आप अपने इतिहास के लिए (MongoDB संगत) भिन्न उत्पन्न करने के लिए github.com/mirek/node-rus-diff का उपयोग कर सकते हैं ।
18:18 पर मिरेक रुसिन

1
JSON पैच आरएफसी difffs व्यक्त करने के लिए एक तरह से प्रदान करता है। यह कई भाषाओं में कार्यान्वयन है
Jérôme

31

"वर्मंगो" नामक एक संस्करण योजना है जो कुछ पहलुओं को संबोधित करती है जिन्हें अन्य उत्तरों में निपटाया नहीं गया है।

इन मुद्दों में से एक समवर्ती अद्यतन है, दूसरा एक दस्तावेज़ हटा रहा है।

वर्मंगो एक छाया संग्रह में दस्तावेज़ प्रतियों को संग्रहीत करता है। कुछ उपयोग के मामलों के लिए यह बहुत अधिक उपरिशायी हो सकता है, लेकिन मुझे लगता है कि यह कई चीजों को सरल भी करता है।

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


5
आप वास्तव में इसका उपयोग कैसे करते हैं?
12 रुपये

6
इस परियोजना का वास्तव में उपयोग कैसे किया जाता है, इस बारे में कोई दस्तावेज नहीं है। क्या यह कुछ ऐसा है जो किसी भी तरह मोंगो के साथ रहता है? यह एक जावा पुस्तकालय है? क्या यह केवल समस्या के बारे में सोचने का एक तरीका है? कोई विचार और कोई संकेत नहीं दिया जाता है।
फुटट्रॉटर

1
यह वास्तव में एक जावा ऐप है और
रिलेवेंट

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 }
)

नया संस्करण डालें: (और समवर्ती सम्मिलित / अद्यतन रोकें)

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 याद रखें)


Mmapv1 स्टोरेज के साथ, हर बार एक नया संस्करण डेटा में जोड़ा जाता है, इस बात की संभावना है कि दस्तावेज़ को स्थानांतरित कर दिया जाएगा।
raok1997

हाँ य़ह सही हैं। लेकिन अगर आप हर बार नए संस्करण जोड़ते हैं, तो यह उपेक्षित होना चाहिए।
बेंजामिन एम

12

यदि आप एक रेडी-टू-रोल समाधान की तलाश कर रहे हैं -

Mongoid सरल संस्करण में बनाया गया है

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

मोंगॉयड-इतिहास एक रूबी प्लगइन है जो ऑडिटिंग, पूर्ववत और फिर से करने के साथ काफी अधिक जटिल समाधान प्रदान करता है

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


18
रूबी प्रोग्रामिंग भाषा के लिए।
फुटट्रॉटर

9

मैंने इस समाधान के माध्यम से काम किया जो डेटा के प्रकाशित, ड्राफ्ट और ऐतिहासिक संस्करणों को समायोजित करता है:

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

मैं यहाँ मॉडल की व्याख्या करता हूं: http://software.danielwatrous.com/repreting-revision-data-in-mongbb/

उन लोगों के लिए जो जावा में कुछ इस तरह से लागू कर सकते हैं , यहां एक उदाहरण है:

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

मैंने एक उल्का / MongoDB परियोजना के लिए नीचे के पैकेज का उपयोग किया है, और यह अच्छी तरह से काम करता है, मुख्य लाभ यह है कि यह एक ही दस्तावेज़ में एक सरणी में इतिहास / संशोधन संग्रहीत करता है, इसलिए परिवर्तन-इतिहास तक पहुंचने के लिए अतिरिक्त प्रकाशन या मिडलवेयर की कोई आवश्यकता नहीं है । यह सीमित संख्या में पिछले संस्करणों (उदाहरण के अंतिम दस संस्करण) का समर्थन कर सकता है, यह परिवर्तन-संघनन का भी समर्थन करता है (इसलिए एक विशिष्ट अवधि के भीतर हुए सभी परिवर्तन एक संशोधन द्वारा कवर किए जाएंगे)।

nicklozon / उल्का-संग्रह-संशोधन

एक अन्य ध्वनि विकल्प उल्का वर्मोंगो ( यहां ) का उपयोग करना है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.