एकत्रीकरण ढांचा ऐसे के लिए आदर्श है। वांछित परिणाम प्राप्त करने के लिए निम्न पाइपलाइन चलाने पर विचार करें।
pipeline = [
{
"$match": {
"name": "james",
"books.year": 1990
}
},
{
"$project": {
"numberOfBooks": {
"$size": {
"$filter": {
"input": "$books",
"as": "el",
"cond": { "$eq": [ "$$el.year", 1990 ] }
}
}
}
}
}
];
db.collection.pipeline(pipeline);
उपरोक्त पाइपलाइन नए $filterका उपयोग करती है कोड>
मोंगोडीबी 3.2 के लिए उपलब्ध ऑपरेटर एक सरणी का उत्पादन करने के लिए जो निर्दिष्ट शर्त को पूरा करता है यानी यह बाहरी तत्वों को फ़िल्टर करता है जो मानदंडों को पूरा नहीं करते हैं। आरंभिक $match
कोड>
पाइपलाइन अनुकूलन कार्यनीति के रूप में एकत्रीकरण पाइपलाइन में आने वाले दस्तावेज़ों को जल्दी से फ़िल्टर करने के लिए पाइपलाइन आवश्यक है।
$size
ऑपरेटर जो एक अभिव्यक्ति को तर्क के रूप में स्वीकार करता है, फिर आपको परिणामी सरणी में तत्वों की संख्या देता है, इस प्रकार आपकी वांछित पुस्तक गणना होती है।
एक वैकल्पिक समाधान के लिए जो $ का उपयोग नहीं करता है। फ़िल्टर
पिछले संस्करणों में ऑपरेटर नहीं मिला, निम्नलिखित पाइपलाइन संचालन पर विचार करें:
pipeline = [
{
"$match": {
"name": "james",
"books.year": 1990
}
},
{
"$project": {
"numberOfBooks": {
"$size": {
"$setDifference": [
{
"$map": {
"input": "$books",
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "$$el.year", 1990 ] },
"$$el",
false
]
}
}
},
[false]
]
}
}
}
}
];
db.collection.pipeline(pipeline);
$project
पाइपलाइन चरण में पुस्तकों की सरणी को फ़िट करना शामिल है ताकि आप उन दस्तावेज़ों को हटा दें जिनमें वर्ष 1990 नहीं है। यह $setDifference
और $map
ऑपरेटरों।
$map
ऑपरेटर संक्षेप में एक नया सरणी फ़ील्ड बनाता है जो एक सरणी के प्रत्येक तत्व के लिए एक उप-अभिव्यक्ति में मूल्यांकन किए गए तर्क के परिणामस्वरूप मान रखता है। $setDifference
ऑपरेटर तब तत्वों के साथ एक सेट देता है जो पहले सेट में दिखाई देता है लेकिन दूसरे सेट में नहीं; यानी पहले के सापेक्ष दूसरे सेट का एक सापेक्ष पूरक करता है। इस मामले में यह अंतिम पुस्तकें सरणी लौटाएगा जिसमें वर्ष 1990 के साथ तत्व हैं और बाद में $आकार
परिणामी सरणी में तत्वों की संख्या की गणना करता है, इस प्रकार आपको पुस्तक संख्या देता है।
ऐसे समाधान के लिए जो का इस्तेमाल करता हो $अनविंड
ऑपरेटर, इस बात को ध्यान में रखते हुए (टिप्पणियों में @BlakesSeven की इस व्यावहारिक प्रतिक्रिया के लिए धन्यवाद):
और अंतिम उपाय के रूप में, निम्न पाइपलाइन चलाएँ:
pipeline = [
{
"$match": {
"name": "james",
"books.year": 1990
}
},
{ "$unwind": "$books" },
{
"$match": { "books.year": 1990 }
},
{
"$group": {
"_id": null
"count": { "$sum": 1 }
}
}
]
db.collection.pipeline(pipeline)