Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

การนับข้อมูลตามหลายฟิลด์ด้วย MongoDB Aggregation

ใช้ $facet เพื่อประมวลผลหลาย Pipeline พร้อมกัน

$facet ช่วยให้สามารถรันหลายการรวมข้อมูล (aggregation pipelines) บนชุดข้อมูลเดียวกันในขั้นตอนเดียว

สร้างข้อมูลตัวอย่าง

> db.demo721.insertOne({
    "details1": { "id":101 },
    "details2": { "id":101 },
    "details3": { "id":101 }
});
> db.demo721.insertOne({
    "details1": { "id":101 },
    "details2": { "id":102 },
    "details3": { "id":102 }
});

แสดงข้อมูลทั้งหมด

> db.demo721.find();

ผลลัพธ์:

{ "_id" : ObjectId("5eaaebdd43417811278f5887"), "details1" : { "id" : 101 }, "details2" : { "id" : 101 }, "details3" : { "id" : 101 } }
{ "_id" : ObjectId("5eaaebe943417811278f5888"), "details1" : { "id" : 101 }, "details2" : { "id" : 102 }, "details3" : { "id" : 102 } }

คิวรีนับจำนวน ID ในแต่ละฟิลด์ด้วย $facet

> db.demo721.aggregate([
    {$facet:{
        ids:[
            {$group:{ _id:null,
                d3:{$addToSet: "$details3.id"},
                d2:{$addToSet:"$details2.id"},
                d1:{$addToSet:"$details1.id"}}},
            {$project:{ _id:0,
                listofall:{$setUnion:["$d1","$d2","$d3"]}}}
        ],
        d:[{$project:{ _id:0,
            a1:"$details1.id",
            a2:"$details2.id",
            a3:"$details3.id"}}]
    }},
    {$unwind:"$d"},
    {$unwind:"$ids"},
    {$unwind:"$ids.listofall"},
    {$group:{ _id:"$ids.listofall",
        details1id:{$sum:{$cond:[{$eq:["$d.a1","$ids.listofall"]},1,0]}},
        details2id:{$sum:{$cond:[{$eq:["$d.a2","$ids.listofall"]},1,0]}},
        details3id:{$sum:{$cond:[{$eq:["$d.a3","$ids.listofall"]},1,0]}}}}
])

ผลลัพธ์

{ "_id" : 102, "details1id" : 0, "details2id" : 1, "details3id" : 1 }
{ "_id" : 101, "details1id" : 2, "details2id" : 1, "details3id" : 1 }