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

Mongodb 1to1 उप-दस्तावेजों के बीच संबंध

लिस्टिंग में मैं जिस "इंडेंटेशन" का उपयोग कर रहा हूं, उसे ध्यान में रखते हुए, यह वास्तव में आप जो कर रहे हैं उससे अधिक लंबा लग सकता है, लेकिन वास्तव में ऐसा नहीं है।

यह $ का उपयोग करने का एक और वास्तव में अच्छा उदाहरण है। नक्शा जैसा कि MongoDB 2.6 और उच्चतर के लिए उपलब्ध है। $unwind , लेकिन "अनवाउंड" होने वाले सरणियों में वास्तव में केवल एक . होता है उनमें तत्व। तो कृपया मेरे "highlander" को क्षमा करें संदर्भ जिनका मैं विरोध नहीं कर सका :)

db.users.aggregate([

    // Match your document or documents
    { "$match": {
        "commentUpvotes.id": 12
    }},

    // Get the one "up-votes" entry that matches
    { "$project": {
        "posts": 1,
        "comments": 1,
        "commentUpVotes": {
            "$setDifference": [
                { 
                    "$map": {
                        "input": "$commentUpvotes",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { "$eq": [ "$$el.id", 12 ] },
                                "$$el",
                                false
                            ]
                        }  
                    }
                },
                [false]
            ]
        }
    }},

    // There is only one!
    { "$unwind": "$commentUpVotes" },

    // Get the one comments entry that matches
    { "$project": {
        "posts": 1,
        "comments": {
            "$setDifference": [
                { 
                    "$map": {
                        "input": "$comments",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { 
                                    "$eq": [ 
                                        { "$substr": [ "$$el.id", 0, 4 ] }, 
                                        "$commentUpVotes.commentId"
                                    ] 
                                },
                                "$$el",
                                false
                            ]
                        }  
                    }
                },
                [false]
            ]
        },
        "commentUpVotes": 1
    }},

    // And there is only one!
    { "$unwind": "$comments" },

    // Get the one post that matches
    { "$project": { 
        "posts": {
            "$setDifference": [
                { 
                    "$map": {
                        "input": "$posts",
                        "as": "el",
                        "in": {
                            "$cond": [
                                { 
                                    "$eq": [ 
                                        "$$el.id", 
                                        "$comments.postId"
                                    ] 
                                },
                                "$$el",
                                false
                            ]
                        }  
                    }
                },
                [false]
            ]
        },
        "comments": 1,
        "commentUpVotes": 1
    }},

    // Optionally group back to arrays. There can be only one!
    { "$group": {
        "_id": "$_id",
        "posts": { "$first": "$posts" },
        "comments": { "$push": "$comments" },
        "commentUpVotes": { "$push": "$commentUpVotes" }
    }}

])

तो अंतिम परिणाम होगा:

{
    "_id" : ObjectId("539065d3cd0f2aac5f55778e"),
    "posts" : [
            {
                    "title" : "post1",
                    "id" : "123"
            }
    ],
    "comments" : [
            {
                    "id" : 1910,
                    "postId" : "123",
                    "title" : "comment1",
                    "comment" : "some comment",
                    "user" : "user13"
            }
    ],
    "commentUpVotes" : [
            {
                    "id" : 12,
                    "commentId" : "1910",
                    "upvotedBy" : "user91"
            }
    ]
}

मुझे पता है कि आपने "कोई स्कीमा परिवर्तन नहीं" के लिए कहा था, लेकिन वास्तव में यह कहने के लिए एक स्कीमा परिवर्तन नहीं है कि आपकी id रखना एक अच्छा विचार है एक सुसंगत प्रकार के यहाँ मान। वर्तमान में आप इस प्रक्रिया में पूर्णांक और तार मिला रहे हैं (मुझे आशा है कि यह सिर्फ एक उदाहरण है) जो एक अच्छा विचार नहीं है।

इस प्रकार कुछ "सीमित कास्टिंग" है जो वास्तव में <का उपयोग करके यहां नियोजित उपलब्ध है। मजबूत>$सबस्ट्र , हालांकि आपका वास्तविक समाधान वास्तव में ऐसा करने के तरीके में भिन्न हो सकता है। मैं दृढ़ता से सुझाव देता हूं कि यदि डेटा को ठीक करने की वास्तव में आवश्यकता है तो उसे ठीक करें।

किसी भी मामले में, $ के लिए एक बहुत अच्छा उपयोग नक्शा




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. जांचें कि क्या फ़ील्ड मान सरणी में बाहर निकलता है - MongoDB

  2. Mongodb में समानांतर सरणियों को अनुक्रमित करना

  3. ClusterControl सर्वर को कैसे सुरक्षित करें

  4. सॉर्ट ऑर्डर के आधार पर संग्रह में दस्तावेज़ की नियुक्ति प्राप्त करें

  5. पायथन डिक्शनरी:आपको 'वर्णों को हटा रहा है'