किसी अन्य संग्रह की वस्तुओं में फ़ील्ड के रूप में उनके उपयोग के आधार पर शीर्ष रैंक वाली वस्तुओं की सूची कैसे प्राप्त करें?
यहां परिदृश्य की व्याख्या करने वाला एक मोंगोडब खेल का मैदान है - 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