MongoDB - การจัดกลุ่มตามเอกสารภายในและดึงผลลัพธ์อันดับต้น ๆ

ฉันกำลังพยายามค้นหาทักษะทั่วไป (และทั่วไปน้อยที่สุด) ที่จัดเก็บไว้ในฐานข้อมูล mongo ฉันใช้พังพอนเพื่อดึงผลลัพธ์

User คือเอกสารรูท ซึ่งแต่ละเอกสารมีเอกสาร Profile อยู่ภายใน โปรไฟล์มีแอตทริบิวต์เป็น 'ทักษะ' ซึ่งประกอบด้วยอาร์เรย์ ProfileSkillEntry ซึ่งมี title (ชื่อทักษะ)

return User.aggregate([{
        $group: {
            '_id': '$profile.skills.title',
            'count': {
                $sum: 1
            }
        }
    }, {
        $sort: {
            'count': -1
        }
    }, {
        $limit: 5
    }]);

ฉันคาดหวังว่ามันจะรวมทักษะผู้ใช้ที่ลงทะเบียนทั้งหมดเข้าด้วยกัน ค้นหา 5 อันดับแรกที่เกิดขึ้นและส่งคืนสิ่งนั้น ดูเหมือนว่าจะจัดกลุ่มต่อผู้ใช้และให้ผลลัพธ์ที่ไม่ถูกต้อง

ตัวอย่าง User โครงสร้างเอกสาร:

{
    "_id" : ObjectId("..."),
    "firstName" : "Harry",
    "lastName" : "Potter",
    "profile" : {
        "_id" : ObjectId("..."),
        "skills" : [
            {
                "_id" : ObjectId("..."),
                "title" : "Java",
                "description" : "Master",
                "dateFrom" : "31/07/2019",
                "coreSkill" : true
            },
            {
                "_id" : ObjectId("..."),
                "title" : "JavaScript",
                "description" : "Proficient",
                "dateFrom" : "31/07/2019",
                "coreSkill" : false
            }
        ],
    }
}

person A5H73Y    schedule 08.09.2019    source แหล่งที่มา
comment
กรุณาส่งตัวอย่างเอกสารของคุณ   -  person Dexter    schedule 09.09.2019
comment
@Anban รวมตัวอย่างเอกสารผู้ใช้   -  person A5H73Y    schedule 09.09.2019


คำตอบ (1)


กรุณาใช้แบบสอบถามด้านล่าง เพียงเพิ่มการเรียงลำดับและขีดจำกัดตามความต้องการของคุณ

db.test.aggregate(
[{ $unwind: {  path: "$profile.skills"} }, 
{ $group: {  _id: "$profile.skills.title",  
    "count": {    $sum: 1  }} }] )
person Dexter    schedule 10.09.2019
comment
มหัศจรรย์! ขอบคุณ - person A5H73Y; 10.09.2019