किसी अन्य संग्रह की वस्तुओं में फ़ील्ड के रूप में उनके उपयोग के आधार पर शीर्ष रैंक वाली वस्तुओं की सूची कैसे प्राप्त करें?

यहां परिदृश्य की व्याख्या करने वाला एक मोंगोडब खेल का मैदान है - https://mongoplayground.net/p/gTMm1JVv9uV

नीचे दिए गए उदाहरण में, category 245 दो बार और 276 का उपयोग posts संग्रह में एक बार किया गया है। आउटपुट posts में उपयोग की संख्या के आधार पर श्रेणियों को रैंक करेगा

ध्यान दें कि पोस्ट संग्रह में केवल श्रेणी आईडी है इसलिए श्रेणियों का संग्रह देखना आवश्यक है।

इसके आधार पर, अपेक्षित आउटपुट श्रेणी के टेक्स्ट की एक सरणी है।

{
  topCategories: ["category 245", "category 276"]
}

दो संग्रहों में एक नमूना डेटा नीचे है:

db={
  categories: [
    {
      "_id": 231,
      "text": "category 231",
      
    },
    {
      "_id": 245,
      "text": "category 245",
      
    },
    {
      "_id": 276,
      "text": "category 276",
      
    }
  ],
  posts: [
    {
      "_id": 71,
      category: "245"
    },
    {
      "_id": 72,
      category: "276"
    },
    {
      "_id": 74,
      category: "245"
    }
  ]
}
1
Kal 25 अक्टूबर 2020, 03:56

2 जवाब

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

मैंने पहले की क्वेरी में addToSet का उपयोग किया है लेकिन पता चला है कि यह ऑर्डर को बनाए नहीं रखता है। मैंने इसे push ऑपरेटर से बदल दिया है।

db.posts.aggregate([
  {
    $addFields: {
      category: {
        $toInt: "$category"
      },
      
    }
  },
  {
    $lookup: {
      from: "categories",
      as: "category",
      localField: "category",
      foreignField: "_id"
    }
  },
  {
    "$unwind": "$category"
  },
  {
    "$group": {
      "_id": "$category._id",
      "count": {
        "$sum": 1
      },
      "category": {
        "$first": "$category"
      }
    }
  },
  {
    "$sort": {
      "count": -1
    }
  },
  {
    "$project": {
      categoriesText: "$category.text"
    }
  },
  {
    "$group": {
      "_id": null,
      "categoriesText": {
        "$push": "$categoriesText"
      }
    }
  },
  {
    "$project": {
      _id: 0,
      topCategories: "$categoriesText"
    }
  }
])

नया खेल का मैदान

1
wak786 25 अक्टूबर 2020, 10:32

तुम कोशिश कर सकते हो,

  • $group द्वारा category और $toInt का उपयोग करके पूर्णांक में कनवर्ट करें, $sum का उपयोग करके कुल डुप्लिकेट श्रेणियों की गणना करें
  • $loopup श्रेणियों के संग्रह के साथ
  • $sort काउंट फील्ड के अवरोही क्रम के अनुसार
  • $group एक सरणी फ़ील्ड में श्रेणियों को संयोजित करने के लिए, $arrayElemAt का उपयोग करके श्रेणी सरणी से पहला तत्व प्राप्त करें और इसे topCategories फ़ील्ड में पुश करें
db.posts.aggregate([
  {
    $group: {
      _id: { $toInt: "$category" },
      count: { $sum: 1 }
    }
  },
  {
    $lookup: {
      from: "categories",
      as: "category",
      localField: "_id",
      foreignField: "_id"
    }
  },
  { $sort: { count: -1 } },
  {
    $group: {
      _id: null,
      topCategories: {
        $push: { $arrayElemAt: ["$category.text", 0] }
      }
    }
  }
])

खेल का मैदान

1
turivishal 25 अक्टूबर 2020, 10:01