एकत्रीकरण ढांचा
और नहीं .distinct()
आदेश:
db.event.aggregate([
// De-normalize the array content to separate documents
{ "$unwind": "$tags" },
// Filter the de-normalized content to remove non-matches
{ "$match": { "tags": /foo/ } },
// Group the "like" terms as the "key"
{ "$group": {
"_id": "$tags"
}}
])
रेगेक्स की शुरुआत में आप "एंकर" का उपयोग करने के लिए शायद बेहतर हैं, क्या आपका मतलब स्ट्रिंग की "शुरुआत" से है। और यह भी करना $match
इससे पहले कि आप $unwind
को प्रोसेस करें
साथ ही:
db.event.aggregate([
// Match the possible documents. Always the best approach
{ "$match": { "tags": /^foo/ } },
// De-normalize the array content to separate documents
{ "$unwind": "$tags" },
// Now "filter" the content to actual matches
{ "$match": { "tags": /^foo/ } },
// Group the "like" terms as the "key"
{ "$group": {
"_id": "$tags"
}}
])
यह सुनिश्चित करता है कि आप $unwind
को प्रोसेस नहीं कर रहे हैं।
संग्रह में प्रत्येक दस्तावेज़ पर और सुनिश्चित करने के लिए "फ़िल्टर" करने से पहले केवल वे जिनमें आपके "मिलान टैग" मान हो सकते हैं।
संभावित मैचों के साथ बड़े सरणियों को कुछ हद तक कम करने का वास्तव में "जटिल" तरीका थोड़ा अधिक काम लेता है, और MongoDB 2.6 या अधिक:
db.event.aggregate([
{ "$match": { "tags": /^foo/ } },
{ "$project": {
"tags": { "$setDifference": [
{ "$map": {
"input": "$tags",
"as": "el",
"in": { "$cond": [
{ "$eq": [
{ "$substr": [ "$$el", 0, 3 ] },
"foo"
]},
"$$el",
false
]}
}},
[false]
]}
}},
{ "$unwind": "$tags" },
{ "$group": { "_id": "$tags" }}
])
तो $map
सरणियों का एक अच्छा "इन-लाइन" प्रोसेसर है लेकिन यह केवल इतनी दूर तक जा सकता है। $setDifference
ऑपरेटर false
को नकारता है मेल खाता है, लेकिन अंततः आपको अभी भी $unwind
. को संसाधित करने की आवश्यकता है बाकी $group
करने के लिए समग्र रूप से विशिष्ट मूल्यों के लिए मंच।
यहाँ लाभ यह है कि सरणियाँ अब केवल "टैग" तत्व से "कम" हो जाती हैं जो मेल खाती हैं। जब आप एक ही दस्तावेज़ में "एकाधिक विशिष्ट" मान होते हैं तो घटनाओं की "गिनती" चाहते हैं, तो इसका उपयोग न करें। लेकिन फिर, इससे निपटने के और भी तरीके हैं।