2012-06-08 17 views
5

मेरे पास एक mongoengine है। दस्तावेज़ उपclass उपयोगकर्ता परिभाषित।एंबेडेड दस्तावेज़ के रूप में मोंगोएन्गिन दस्तावेज़

class User(Document): 
    meta = {'collection': 'users', 'allow_inheritance': False} 
    _id = ObjectIdField() 
    password = StringField(max_length=50) 
    name = StringField(max_length=50, required 

अब मैं स्टैंडअलोन दस्तावेज़ के रूप में उपयोग करने के लिए अपने स्वयं के संग्रह के साथ चाहते हैं, लेकिन मैं खेल रिकॉर्ड के हिस्से के रूप EmbeddedDocument के रूप में उपयोग करने के लिए भी हैं:

class Game(Document): 
    meta = {'collection': 'games', 'allow_inheritance': False} 
    _id = ObjectIdField() 
    name = StringField() 
    owner = EmbeddedField(User) 

लेकिन वहाँ एक समस्या है। Mongoengine केवल एम्बेडेड दस्तावेज़ उपखंडों को एम्बेड करने की अनुमति देता है। क्या इसे हल करने का कोई तरीका है?

उत्तर

2

इस तरह का प्रयास करें:

class User(Document, EmbeddedDocument): 
    ... 
+1

यह 0.10 संस्करण – user541905

1

चाहिए आप एक ReferenceField का उपयोग नहीं किया?

अन्यथा, आप दो डिस्कनेक्ट किए गए हैं, लेकिन तार्किक रूप से समान, दस्तावेज संग्रहीत कर रहे हैं।

+1

के बाद काम नहीं करता है हाँ मुझे पता है। यह योजनाबद्ध व्यवहार है। – yakxxx

+0

एक साधारण प्रश्न के लिए देर से पुनरुत्थान, मुझे पता है, लेकिन यह जवाब है। +1। अपने डेटा को दो अलग-अलग स्थानों में कभी भी स्टोर न करें (जब तक आवश्यकता जबरदस्त न हो और आप पहले से ही सभी प्रभावों को समझ सकें)। एप्लिकेशन कोड में संदर्भ फ़ील्ड का विस्तार करना वास्तव में आसान है, और कुछ एज केस को याद करना लगभग आसान है, अपनी ऑब्जेक्ट की दूसरी प्रति अपडेट करना भूलें, और असंगतता के साथ समाप्त हो जाएं। – dokkaebi

+1

@ डॉककाबे मैं आपके साथ 100% सहमत हूं। मैं बस कुछ विरासत कोड/डेटाबेस के साथ काम कर रहा था और इसे mongoengine के माध्यम से इंटरफेस करना पड़ा। हमारी कुछ सेवाएं सीधे डेटाबेस पर मार रही थीं। मैंने एक स्थान पर स्कीमा का प्रबंधन करने के लिए रीस्टफुल एपीआई के साथ मोंगो इंटरफेसिंग के साथ प्रमुख रिफैक्टरिंग शुरू की। अगला कदम डीबी संरचना को बेहतर बनाने के लिए था जैसा कि आप कहते हैं, लेकिन हमने कुछ चरणों में प्रक्रिया को विभाजित करने के लिए बेहतर परीक्षण/नियंत्रण किया है। और पहला कदम रीस्टफुल एपीआई का उपयोग करने के लिए प्रत्येक निर्भर सेवा को स्विच करना था, और उसके बाद डीबी स्कीमा को पारदर्शी रूप से बदलना था :) – yakxxx

संबंधित मुद्दे