एकत्रीकरण ढांचे के साथ आप जिस प्रकार की गणना का वर्णन कर रहे हैं, उसे करना संभव नहीं है - और यह नहीं है क्योंकि कोई $unwind
नहीं है गैर-सरणी के लिए विधि। भले ही व्यक्ति:मूल्य ऑब्जेक्ट एक सरणी में दस्तावेज़ थे, $unwind
मदद नहीं करेगा।
"समूह द्वारा" कार्यक्षमता (चाहे मोंगोडीबी या किसी रिलेशनल डेटाबेस में) किसी फ़ील्ड या कॉलम के मान पर की जाती है। हम दूसरे फ़ील्ड के मान के आधार पर फ़ील्ड के मान और योग/औसत/आदि के आधार पर समूह बनाते हैं।
सरल उदाहरण आपके सुझाव का एक प्रकार है, उदाहरण लेख संग्रह में रेटिंग फ़ील्ड जोड़ा गया है, लेकिन उपयोगकर्ता से रेटिंग के लिए मानचित्र के रूप में नहीं बल्कि इस तरह एक सरणी के रूप में:
{ title : title of article", ...
ratings: [
{ voter: "user1", score: 5 },
{ voter: "user2", score: 8 },
{ voter: "user3", score: 7 }
]
}
अब आप इसे इसके साथ जोड़ सकते हैं:
[ {$unwind: "$ratings"},
{$group : {_id : "$ratings.voter", averageScore: {$avg:"$ratings.score"} } }
]
लेकिन जैसा कि आप वर्णन करते हैं यह संरचित उदाहरण इस तरह दिखेगा:
{ title : title of article", ...
ratings: {
user1: 5,
user2: 8,
user3: 7
}
}
या यह भी:
{ title : title of article", ...
ratings: [
{ user1: 5 },
{ user2: 8 },
{ user3: 7 }
]
}
भले ही आप $unwind
यह, यहाँ पर एकत्रित करने के लिए कुछ भी नहीं है। जब तक आप सभी संभावित कुंजियों (उपयोगकर्ताओं) की पूरी सूची नहीं जानते, आप इसके साथ बहुत कुछ नहीं कर सकते। [*]
आपके पास जो होगा उसके समान संबंधपरक डीबी स्कीमा होगा:
CREATE TABLE T (
user1: integer,
user2: integer,
user3: integer
...
);
यह वह नहीं है जो किया जाएगा, इसके बजाय हम यह करेंगे:
CREATE TABLE T (
username: varchar(32),
score: integer
);
और अब हम SQL का उपयोग करके एकत्र करते हैं:
select username, avg(score) from T group by username;
MongoDB के लिए एक एन्हांसमेंट अनुरोध है जो आपको भविष्य में एकत्रीकरण ढांचे में ऐसा करने की अनुमति दे सकता है - मूल्यों को इसके विपरीत करने के लिए मूल्यों को प्रोजेक्ट करने की क्षमता। इस बीच, हमेशा नक्शा/कमी होती है।
[*] ऐसा करने का एक जटिल तरीका है यदि आप सभी अद्वितीय कुंजियों को जानते हैं (आप इस तरह की विधि के साथ सभी अद्वितीय कुंजियाँ पा सकते हैं) लेकिन यदि आप सभी कुंजियाँ जानते हैं तो आप केवल प्रश्नों का एक क्रम चला सकते हैं फॉर्म db.articles.find({"ratings.user1":{$exists:true}},{_id:0,"ratings.user1":1})
प्रत्येक उपयोगकर्ताX के लिए जो उनकी सभी रेटिंग लौटाएगा और आप एक बहुत ही जटिल प्रक्षेपण के बजाय एकत्रीकरण ढांचे की आवश्यकता के बजाय उन्हें पर्याप्त रूप से जोड़ और औसत कर सकते हैं।