मैं मोंगो (वरीयता से एक एसक्यूएल लड़का) के लिए नया हूं और किसी और द्वारा स्थापित एप्लिकेशन में काम कर रहा हूं। मेरे पास इस तरह के रिकॉर्ड हैं, साथ ही अधिक जानकारी:

City:
    name: "name"
    State: ObjectId({id here})
    slug: "slug"
    images: [images]
    ...

और राज्य में स्लग के साथ एक टेक्स्ट फ़ील्ड भी है। मैं संबंधित शहरों के लिए एक शहर के लिए एक नई प्रविष्टि बनाना चाहता हूं। तो यह छवियों, स्लग, राज्य स्लग और नाम के साथ एक सरणी होगी। मैंने निम्नलिखित की कोशिश की है, लेकिन मैं राज्य स्लग के लिए क्वेरी जानकारी के साथ समाप्त होता हूं:

db.getCollection('city').find(
{
    $or: 
        [
            {"name": "Camden"}, 
            {"name": "Virginia Beach"}, 
            {"name": "Annapolis"}
        ]
},{images:1, slug:1, state:1, name:1}
).forEach(function(city){
    db.city.update({"name" : "Lewes"}, {$push:{'relatedCities':
        { "images":city.images,
          "slug":city.slug,
          "name":city.name,
          "stateSlug":db.state.find(city.state,{slug:1,_id:0})
        }
    }})
})

क्या कोई तरीका है जिससे मैं इस क्वेरी को काम कर सकता हूं? मेरे पास एक्सेल फ़ाइल और एक पायथन स्क्रिप्ट में प्रश्नों के लिए उपयोग किए जाने वाले नाम हैं जो इस प्रारूप में जानकारी को जेएस फ़ाइल में आउटपुट कर सकते हैं यदि मैं यह समझ सकता हूं कि इसे कैसे काम करना है। किसी भी मदद के लिए धन्यवाद!

1
Logan 26 सितंबर 2016, 02:55

1 उत्तर

सबसे बढ़िया उत्तर

आपको जो दृष्टिकोण अपनाने की आवश्यकता है, उसमें एक एकत्रीकरण पाइपलाइन चलाना शामिल है जो निम्नलिखित पाइपलाइन चरणों का उपयोग करता है (दिए गए क्रम में):

1) $match पाइपलाइन में आने वाले दस्तावेज़ों को फ़िल्टर करने के लिए। एक $in $or यदि आपकी अभिव्यक्ति में समानता जांच शामिल है एक ही फ़ील्ड. यह SQL के WHERE क्लॉज के समान है जहां उदा।

SELECT name, images, state, slug
WHERE name in ('Camden', 'Virginia Beach', 'Annapolis')

की बजाय

SELECT name, images, state, slug
WHERE 
    (name = 'Camden') OR
    (name = 'Virginia Beach') OR
    (name = 'Annapolis')

2) $lookup "शामिल" संग्रह से दस्तावेज़ों में फ़िल्टर करने के लिए उसी डेटाबेस में एक अनछुए संग्रह में बाएं बाहरी जुड़ने के लिए जो प्रसंस्करण के लिए state संग्रह है। $lookup चरण "शामिल" संग्रह स्थिति के दस्तावेज़ों से _id फ़ील्ड के साथ इनपुट दस्तावेज़ों से state फ़ील्ड के बीच एक समानता मिलान करता है।

3) $unwind - पिछले के परिणामों से नया क्षेत्र $lookup पाइपलाइन एक सरणी है, इसलिए आपको एक $unwind अपनी पाइपलाइन का चरण ताकि आप सरणी को समतल कर सकें क्योंकि इसे एक असामान्य फ़ील्ड के रूप में और नीचे संसाधित करने की आवश्यकता है।

4) $group सभी दस्तावेज़ों को समूहबद्ध करने के लिए पाइपलाइन चरण और संबंधित शहरों की एक सरणी बनाने के लिए जिसमें पिछली पाइपलाइन से फ़ील्ड हैं। $group< /strong> पाइपलाइन ऑपरेटर SQL के GROUP BY क्लॉज के समान है। SQL में, आप GROUP BY का उपयोग तब तक नहीं कर सकते जब तक कि आप किसी एकत्रीकरण फ़ंक्शन का उपयोग नहीं करते। उसी तरह, आपको MongoDB में भी एकत्रीकरण फ़ंक्शन का उपयोग करना होगा। आप एग्रीगेशन फ़ंक्शन के बारे में यहां पढ़ सकते हैं।

एरे बनाने के लिए आपको जिस संचायक ऑपरेटर की आवश्यकता होगी वह है $push.

5) $project अंतिम चरण का उपयोग पिछली पाइपलाइन में दस्तावेज़ों से गुणों का चयन या नाम बदलने के लिए किया जाता है - जैसा कि आप SQL SELECT क्लॉज के साथ करेंगे। स्ट्रिंग अक्षर के साथ एक नया फ़ील्ड बनाने के लिए, आपको $literal ऑपरेटर जो SQL के AS या ALIAS कीवर्ड के समान है।


यहां एक बात ध्यान देने योग्य है कि एक पाइपलाइन को क्रियान्वित करते समय, MongoDB पाइप ऑपरेटरों को एक दूसरे में जोड़ता है। "पाइप" यहाँ लिनक्स अर्थ लेता है: एक ऑपरेटर का आउटपुट निम्नलिखित ऑपरेटर का इनपुट बन जाता है। प्रत्येक ऑपरेटर का परिणाम दस्तावेजों का एक नया संग्रह है। तो मोंगो उपरोक्त पाइपलाइन को निम्नानुसार निष्पादित करता है:

collection | $match | $lookup | $unwind | $group | $project => result

अब, जब आप इस एकत्रीकरण पाइपलाइन को मोंगो शेल में चलाते हैं, तो परिणाम एक सरणी होगी जो आपको toArray() विधि cursor aggregate() मेथड city कलेक्शन पर।

फिर आप city संग्रह में नई शहर प्रविष्टि बना सकते हैं, पहले शून्य सूचकांक के माध्यम से परिणाम सरणी में एकमात्र तत्व तक पहुंच कर सकते हैं जो कि नया city दस्तावेज़ है जिसमें समेकित फ़ील्ड हैं, और < का उपयोग करें। मजबूत>save() विधि दस्तावेज़ को जारी रखने के लिए शहर के संग्रह पर।

निम्नलिखित उदाहरण उपरोक्त अवधारणा को प्रदर्शित करता है:

var pipeline = [
        {
            "$match": {
                "name": { "$in": ["Camden", "Virginia Beach", "Annapolis"] }
            }
        },
        {
            "$lookup": {
                "from": "state",
                "localField": "state",
                "foreignField": "_id",
                "as": "states"
            }
        },
        { "$unwind": "$states" },
        {
            "$group": {
                "_id": null,
                "relatedCities": {
                    "$push": {
                        "images": "$images",
                        "slug": "$slug",
                        "name": "$name",
                        "stateSlug": "$states.slug"
                    }
                }
            }
        },
        {
            "$project": {
                "_id": 0,
                "name": { "$literal": "Lewes" },
                "relatedCities": 1
            }
        }       
    ],
    newCity = db.city.aggregate(pipeline).toArray()[0];

db.city.save(newCity);
1
chridam 26 सितंबर 2016, 13:50