मेरे पास कुछ उपयोगकर्ताओं के साथ डेटाबेस है, जो टीमों से संबंधित हैं। प्रत्येक टीम में एक नेता होता है। प्रत्येक उपयोगकर्ता का एक विषय होता है।

मैं नेता के विषय के आधार पर टीमों का मिलान करना चाहता हूं।

मेरा डेटा इस तरह दिखता है:

db={
  "teams": [
    {
      _id: "t1",
      members: [
        {
          "_id": "u1",
          "leader": true
        },
        {
          "_id": "u2"
        },
        {
          "_id": "u3"
        }
      ],
    },
    {
      _id: "t2",
      members: [
        {
          "_id": "u2",
          "leader": true
        },
        {
          "_id": "u4"
        }
      ],

    },
    {
      _id: "t3",
      members: [
        {
          "_id": "u1",
          "leader": true
        },
        {
          "_id": "u4"
        }
      ],

    },
    {
      _id: "t4",
      members: [
        {
          "_id": "u2",
          "leader": true
        }
      ],

    },

  ],
  "users": [
    {
      "_id": "u1",
      "subject": "history"
    },
    {
      "_id": "u2",
      "subject": "maths"
    },
    {
      "_id": "u3",
      "subject": "geography"
    },
    {
      "_id": "u4",
      "subject": "french"
    }
  ]
}

मैं जो परिणाम चाहता हूं वह है:

{
    "history": ["t1", "t3"],
    "maths": ["t2", "t4"]
}

मेरे पास एक एकत्रीकरण है जो मुझे प्रत्येक नेता का _id प्राप्त करता है, और वहां से मैं चरणों में वांछित परिणाम प्राप्त कर सकता हूं, पहले प्रत्येक नेता का विषय ढूंढकर, फिर परियोजनाओं के माध्यम से वापस जाकर प्रत्येक परियोजना के आधार पर एक विषय निर्दिष्ट कर सकता हूं नेता की पहचान। यह काम करता है लेकिन यह सुरुचिपूर्ण है और मुझे लगता है कि यह धीमा होगा। ऐसा लगता है कि ऐसा करने का कोई बेहतर तरीका होना चाहिए, शायद शामिल होने जैसा कुछ?

क्या एक मोंगोडीबी ऑपरेशन से मैं जो परिणाम चाहता हूं उसे प्राप्त करने का कोई निफ्टी तरीका है?

यहाँ मेरे डेटा के साथ एक मोंगो खेल का मैदान है:

https://mongoplayground.net/p/SIJv9-hVNzJ

किसी भी मदद के लिए बहुत शुक्रिया।

संपादित करें: मेरा परीक्षण डेटा भ्रमित कर रहा है क्योंकि दोनों संग्रहों में '_id' का उपयोग किया जाता है, जिससे उत्तर को अनपैक करना मुश्किल हो जाता है। यहां एक अपडेट किया गया मोंगो प्लेग्राउंड है जो प्रत्येक संग्रह के लिए अलग-अलग प्रमुख नामों का उपयोग करता है और मुझे सही उत्तर समझने में मदद करता है .

1
Little Brain 25 जून 2019, 12:07

1 उत्तर

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

हां, आपको users._id को $lookup के साथ अपने संग्रह में शामिल होना चाहिए, और फिर $arrayToObject के साथ मान को कुंजी में बदलना चाहिए (इसमें पेश किया गया है) मोंगोडब 3.4.4)

ऐसा करने का एक संभावित तरीका यहां दिया गया है:

db.teams.aggregate([
  {
    "$unwind": "$members"
  },
  {
    "$match": {
      "members.leader": true
    }
  },
  {
    "$lookup": {
      "from": "users",
      "localField": "members._id",
      "foreignField": "_id",
      "as": "users"
    }
  },
  {
    "$unwind": "$users"
  },
  {
    "$group": {
      "_id": "$users.subject",
      "team": {
        "$push": "$_id"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$arrayToObject": [
          [
            {
              k: "$_id",
              v: "$team"
            }
          ]
        ]
      }
    }
  }
])

इसे ऑनलाइन आज़माएं: mongoplayground.net/p/TuEpMzHkI-0

0
felix 26 जून 2019, 02:08