मैं डेटाबेस से क्वेरी करने के लिए पाइमोंगो के साथ पायथन का उपयोग कर रहा हूं।

मेरे पास 3 अलग-अलग संग्रह हैं:

पहला:

# Projects collection
{
    "_id": "A",
},
{
    "_id": "B",
},
{
    "_id": "C"
},
..

दूसरा:

# Episodes collection
{
    "_id": "A/Episode01",
    "project": "A",
    "name": "Episode01"
},
{
    "_id": "A/Episode02",
    "project": "A",
    "name": "Episode02"
},
{
    "_id": "B/Episode01",
    "project": "B",
    "name": "Episode01"
},
..

तीसरा:

# Sequences collection
{
    "_id": "A/Episode01/Sequence01",
    "project": "A",
    "episode": "Episode01",
    "name": "Sequence01"
},
{
    "_id": "A/Episode02/Sequence02",
    "project": "A",
    "episode": "Episode02",
    "name": "Sequence02"
},
{
    "_id": "B/Episode01/Sequence01",
    "project": "B",
    "episode": "Episode01",
    "name": "Sequence01"
},
..

मैं प्रोजेक्ट A को क्वेरी करने के लिए कुल का उपयोग करना चाहता हूं और इसके सभी संबंधित एपिसोड और अनुक्रम इस तरह प्राप्त करना चाहता हूं:

{
    "_id": "A",
    "episodes": 
    [
        {
            "_id": "A/Episode01",
            "project": "A",
            "name": "Episode01",
            "sequences": 
            [
                {
                    "_id": "A/Episode01/Sequence01",
                    "project": "A",
                    "episode": "Episode01",
                    "name": "Sequence01"
                },
            ]
        },
        {
            "_id": "A/Episode02",
            "project": "A",
            "name": "Episode02",
            "sequences":
            [
                {
                    "_id": "A/Episode02/Sequence02",
                    "project": "A",
                    "episode": "Episode02",
                    "name": "Sequence02"
                },
            ]
        },
    ]
}

मैं उचित एपिसोड प्राप्त कर सकता हूं, लेकिन मुझे यकीन नहीं है कि किसी भी मिलान अनुक्रम के लिए एक एम्बेड फ़ील्ड कैसे जोड़ा जाए। क्या यह सब एक ही पाइपलाइन क्वेरी में करना संभव है?

अभी मेरी क्वेरी इस तरह दिख रही है:

[
    {"$match": {
        "_id": "A"}
    },
    {"$lookup": {
        "from": "episodes",
        "localField": "_id",
        "foreignField": "project",
        "as": "episodes"}
    },
    {"$group": {
        "_id": {
            "_id": "$_id",
            "episodes": "$episodes"}
    }}
]
0
Green Cell 9 अक्टूबर 2020, 11:23

1 उत्तर

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

आप निम्न की तरह कर सकते हैं

  1. दस्तावेज़ से मिलान करने के लिए $match का उपयोग करें
  2. असंबद्ध क्वेरी का उपयोग करें a> दो संग्रह में शामिल होने के लिए। लेकिन सामान्य जुड़ाव भी संभव है जैसा आपने लिखा है। यह तब आसान होता है जब हमें कुछ जटिल परिस्थितियाँ मिलती हैं।

मोंगो लिपि नीचे दी गई है

[
  {
    "$match": {
      "_id": "A"
    }
  },
  {
    $lookup: {
      from: "Episodes",
      let: {
        id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$project",
                "$$id"
              ]
            }
          }
        },
        {
          $lookup: {
            from: "Sequences",
            let: {
              epi: "$name"
            },
            pipeline: [
              {
                $match: {
                  $expr: {
                    $eq: [
                      "$episode",
                      "$$epi"
                    ]
                  }
                }
              }
            ],
            as: "sequences"
          }
        }
      ],
      as: "episodes"
    }
  }
]

कार्य मोंगो खेल का मैदान


अपडेट 01

मानक लुकअप का उपयोग करना

[
  {
    "$match": {
      "_id": "A"
    }
  },
  {
    "$lookup": {
      "from": "Episodes",
      "localField": "_id",
      "foreignField": "project",
      "as": "episodes"
    }
  },
  {
    $unwind: "$episodes"
  },
  {
    "$lookup": {
      "from": "Sequences",
      "localField": "episodes.name",
      "foreignField": "episode",
      "as": "episodes.sequences"
    }
  },
  {
    $group: {
      _id: "$episodes._id",
      episodes: {
        $addToSet: "$episodes"
      }
    }
  }
]

कार्य मोंगो खेल का मैदान

2
varman 9 अक्टूबर 2020, 12:48