प्रश्न
-
यह एक एकत्रीकरण अद्यतन है, भले ही पाइपलाइन हमें समूह लुकअप आदि जैसे चरणों का उपयोग करने की अनुमति नहीं देती है, जिसका उपयोग यहां किया जाता है। (आप
$out
. का उपयोग कर सकते हैं और संग्रह को या$merge
. के बाद बदलें दस्तावेज़ों को बदलने के लिए (अपडेट के समान)) -
पहला नक्शा
- प्रत्येक विशेषता (विशेषताओं के दस्तावेज़ सदस्य) के लिए, यह इसे सरणी में बनाता है
[["trait_type": "type"] ["value": "Male"] ["display_type": null] ...]
- उस सरणी पर केवल 1 दस्तावेज़ बनाने के लिए उस सरणी को कम करें
{"type" "type","value" :"Male"}
(क्या वह लोअरकेस और "_" भी है)
- प्रत्येक विशेषता (विशेषताओं के दस्तावेज़ सदस्य) के लिए, यह इसे सरणी में बनाता है
-
अब इसकी विशेषता है
"traits": [ { "type": "type", "value": "Male" }, { "type": "accessory", "value": "Mohawk" }, { "type": "accessory", "value": "Earring" }, { "type": "accessory", "value": "Frown" } ]
-
डमी संग्रह के साथ लुकअप
[{}]
(हम उस सरणी के अंदर एक समूह बनाने के लिए ऐसा करते हैं) यह एक चाल की तरह है जो हमें 1 दस्तावेज़ के अंदर स्टेज ऑपरेटरों का उपयोग करने की अनुमति देता है- लुकअप पाइपलाइन खोलती है और प्रकार के अनुसार समूहित करती है
"traits": [ { "values": [ "Mohawk", "Earring", "Frown" ], "type": "accessory" }, { "values": [ "Male" ], "type": "type" } ]
- फिर इसकी एक प्रतिस्थापित रूट प्रकार का मान लेने के लिए, इसे फ़ील्ड-नाम और मान मान के रूप में बनाएं
(if size=1 removes the array)
-
देखने के बाद हमारे पास है
"traits": [ { "accessory": [ "Mohawk", "Earring", "Frown" ] }, { "type": "Male" } ]
-
इसलिए हमें बस इतना करना है कि लक्षणों को कम करें और वस्तुओं को मर्ज करें (कुंजी वैसे भी अद्वितीय हैं क्योंकि हम उनके द्वारा समूहीकृत हैं)
-
और हमें अपेक्षित आउटपुट मिलता है (कम से कम मुझे लगता है कि यह ठीक है)
db.collection.aggregate([
{
"$set": {
"traits": {
"$map": {
"input": "$traits",
"as": "t",
"in": {
"$reduce": {
"input": {
"$map": {
"input": {
"$objectToArray": "$$t"
},
"as": "m",
"in": [
"$$m.k",
"$$m.v"
]
}
},
"initialValue": {},
"in": {
"$let": {
"vars": {
"type_value": "$$value",
"ta": "$$this"
},
"in": {
"$let": {
"vars": {
"key": {
"$arrayElemAt": [
"$$ta",
0
]
},
"value": {
"$arrayElemAt": [
"$$ta",
1
]
}
},
"in": {
"$switch": {
"branches": [
{
"case": {
"$eq": [
"$$key",
"value"
]
},
"then": {
"$mergeObjects": [
"$$type_value",
{
"value": "$$value"
}
]
}
},
{
"case": {
"$eq": [
"$$key",
"trait_type"
]
},
"then": {
"$mergeObjects": [
"$$type_value",
{
"type": {
"$replaceAll": {
"input": {
"$toLower": "$$value"
},
"find": " ",
"replacement": "_"
}
}
}
]
}
}
],
"default": "$$type_value"
}
}
}
}
}
}
}
}
}
}
}
},
{
"$lookup": {
"from": "dummy",
"let": {
"traits": "$traits"
},
"pipeline": [
{
"$set": {
"traits": "$$traits"
}
},
{
"$unwind": {
"path": "$traits"
}
},
{
"$replaceRoot": {
"newRoot": "$traits"
}
},
{
"$group": {
"_id": "$type",
"values": {
"$push": "$value"
}
}
},
{
"$set": {
"type": "$_id"
}
},
{
"$project": {
"_id": 0
}
},
{
"$replaceRoot": {
"newRoot": {
"$cond": [
{
"$eq": [
{
"$size": "$values"
},
1
]
},
{
"$arrayToObject": {
"$let": {
"vars": {
"pair": [
[
"$type",
{
"$arrayElemAt": [
"$values",
0
]
}
]
]
},
"in": "$$pair"
}
}
},
{
"$arrayToObject": {
"$let": {
"vars": {
"pair": [
[
"$type",
"$values"
]
]
},
"in": "$$pair"
}
}
}
]
}
}
}
],
"as": "traits"
}
},
{
"$set": {
"traits": {
"$mergeObjects": "$traits"
}
}
}
])