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

वस्तुओं की सरणी के साथ लुकअप

आपको मूल रूप से $unwind की आवश्यकता है पहले सरणी। MongoDB अभी तक $lookup

साथ ही दक्षता के लिए हमें वास्तव में $concatArrays का उपयोग करना चाहिए। पहले सरणी स्रोत को "शामिल" करें, और उसके बाद केवल एक . करें $lookup ऑपरेशन:

Project.aggregate([
  { "$match": { "project_id": projectId} },
  { "$project": {
    "project_id": 1,
    "updated_at": 1,
    "created_at": 1,
    "owner": 1,
    "name": 1,
    "combined": {
      "$concatArrays": [
        { "$map": {
          "input": {
            "$filter": {
              "input": "$uploaded_files",
              "as": "uf",
              "cond": { "$eq": ["$$uf.upload_id", uploadId ] }
            }
          },
          "as": "uf",
          "in": {
            "$arrayToObject": {
              "$concatArrays": [
                { "$objectToArray": "$$uf" },
                [{ "k": "type", "v": "uploaded_files" }]
              ]
            }
          }
        }},
        { "$map": {
          "input": {
            "$filter": {
              "input": "$file_history",
              "as": "fh",
              "cond": { "$eq": ["$$fh.upload_id", uploadId ] }
            }
          },
          "as": "fh",
          "in": {
            "$arrayToObject": {
              "$concatArrays": [
                { "$objectToArray": "$$fh" },
                [{ "k": "type", "v": "file_history" }]
              ]
            }
          }
        }}
      ]
    }
  }},
  { "$unwind": "$combined" },
  { "$lookup": {
    "from": "files",
    "localField": "combined.file",
    "foreignField": "_id",
    "as": "combined.file"
  }},
  { "$unwind": "$combined.file" },
  { "$lookup": {
    "from": "users",
    "localField": "owner",
    "foreignField": "_id",
    "as": "owner"
  }},
  { "$unwind": "$owner" },
  { "$group": {
    "_id": "$_id",
    "project_id": { "$first": "$project_id" },
    "updated_at": { "$first": "$updated_at" },
    "created_at": { "$first": "$created_at" },
    "owner": { "$first": "$owner" },
    "name": { "$first": "$name" },
    "combined": { "$push": "$combined" }
  }},
  { "$project": {
    "project_id": 1,
    "updated_at": 1,
    "created_at": 1,
    "owner": 1,
    "name": 1,
    "uploaded_files": {
      "$filter": {
        "input": "$combined",
        "as": "cf",
        "cond": { "$eq": [ "$$cf.type", "uploaded_files" ] }
      }    
    },
    "file_history": {
      "$filter": {
        "input": "$combined",
        "as": "cf",
        "cond": { "$eq": [ "$$cf.type", "file_history" ] }
      }    
    }
  }}
])

संक्षेप में

  1. स्रोत पर दो सरणियों को एक साथ लाएं और उन्हें टैग करें, फिर $unwind पहले

  2. $lookup करें संयुक्त विवरण और $unwind पर वह

  3. $lookup करें दूसरे विदेशी स्रोत पर और $unwind वह

  4. $group दस्तावेज़ एक ही सरणी के साथ वापस एक साथ।

  5. $filter "टैग नाम" या "प्रकार" फ़ील्ड द्वारा हमने सरणियों को "अलग" करने के लिए जोड़ा।

आप उसी तरह की प्रक्रिया का पालन कर सकते हैं बस बस $unwind . का उपयोग कर रहे हैं प्रत्येक सरणी पर, फिर "जुड़ें" और एक साथ वापस समूह बनाना। लेकिन वास्तव में इसके लिए पहले स्थान पर केवल "संयोजन" करने की तुलना में बहुत अधिक चरणों की आवश्यकता है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB में Node.js अद्यतन तत्व

  2. डीएओ और निर्भरता इंजेक्शन, सलाह?

  3. क्या कोई पॉलिमर घटक है जो मोंगोडीबी के साथ संचार को सरल बनाता है?

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

  5. मोंगोडब जावा ड्राइवर - कच्चा आदेश?