MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDb एकत्रीकरण डेटा हेरफेर - Arrays के लिए ऑब्जेक्ट

प्रश्न

  • यह एक एकत्रीकरण अद्यतन है, भले ही पाइपलाइन हमें समूह लुकअप आदि जैसे चरणों का उपयोग करने की अनुमति नहीं देती है, जिसका उपयोग यहां किया जाता है। (आप $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"
      }
    }
  }
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. डेटाबेस से कनेक्ट/डिस्कनेक्ट करने का सबसे अच्छा अभ्यास क्या है?

  2. मोंगोडब और नोडज में प्रकार संख्या के क्षेत्र को घटाना

  3. मोंगो में प्राथमिक कुंजी/_आईडी के रूप में स्लग का उपयोग करके प्रदर्शन नुकसान?

  4. मोंगोडीबी $बाइनरीसाइज

  5. सलाह की आवश्यकता:प्रतिक्रिया को MongoDB से ठीक से कैसे कनेक्ट करें