Article {
"_id" : "A",
"title" : "Hello World",
"user_id" : 12345,
"text" : 'My test article',
"comments" : [
{ 'text' : 'blah', 'user_id' : 654321, 'votes' : [987654]},
{ 'text' : 'foo', 'user_id' : 987654, 'votes' : [12345, 654321] },
...
]
}
यहाँ मूल आधार यह है कि मैंने Comments
को नेस्ट किया है Article
. के अंदर . Votes
केवल Comment
पर लागू होता है , इसलिए उन्हें प्रत्येक Comment
. के साथ एक सरणी के रूप में संग्रहीत किया गया है . इस मामले में, मैंने अभी user_id संग्रहीत किया है। यदि आप अधिक जानकारी (time_created, आदि) संग्रहीत करना चाहते हैं, तो आप वस्तुओं की एक सरणी को वोट कर सकते हैं:
... 'votes' : [ { user_id : 987654, ts : 78946513 } ] ...
अपने प्रश्नों को कुशलतापूर्वक कैसे निष्पादित करें:
db.articles.find( { _id : 'A' } )
यह सब कुछ एक प्रश्न के साथ मिलता है। प्रति टिप्पणी वोटों की गणना करने के लिए आपको कुछ क्लाइंट-साइड लॉजिक करना पड़ सकता है, लेकिन यह बहुत मामूली है।
db.articles.ensureIndex( { "comments.user_id" : 1 } )
db.articles.find( { "comments.user_id" : 987654 } ) // returns all document fields
अनुक्रमणिका किसी दस्तावेज़ में टिप्पणियों को कुशलता से खोजने की अनुमति देगी।
वर्तमान में उप-सरणी से केवल मैचों को निकालने का कोई तरीका नहीं है। यह प्रश्न वास्तव में उस उपयोगकर्ता द्वारा टिप्पणियों के साथ सभी लेख लौटाएगा। यदि यह संभावित रूप से बहुत अधिक डेटा है, तो आप कुछ ट्रिमिंग कर सकते हैं।
db.articles.find( { "comments.user_id" : 987654 }, { "title" : 1, "comments.user_id" : 1 })
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )
फिर से, यह केवल टिप्पणियों को ही नहीं, बल्कि सभी लेखों को लौटा देगा।
यहां एक ट्रेड-ऑफ बनाया जाना है। लेख को वापस करने से ऐसा लग सकता है कि हम बहुत अधिक डेटा वापस ला रहे हैं। लेकिन जब आप क्वेरी #3 करते हैं तो आप उपयोगकर्ता को क्या प्रदर्शित करने की योजना बना रहे हैं?
"टिप्पणियों के लिए मैंने वोट किया है" . की सूची प्राप्त करना टिप्पणी के बिना बहुत उपयोगी नहीं है। बेशक टिप्पणी लेख के बिना बहुत उपयोगी नहीं है (या कम से कम सिर्फ शीर्षक)।
अधिकांश समय, क्वेरी #3 Votes
. से जुड़ने में बदल जाती है करने के लिए Comments
Articles
. के लिए . अगर ऐसा है, तो क्यों न केवल शुरुआत के लिए लेखों को वापस लाया जाए?