ใช้ $reduce, $map, $objectToArray ใน Aggregate
รวมคีย์จากทุกเอกสารในอาร์เรย์โดยแปลงแต่ละอ็อบเจกต์เป็นอาร์เรย์ key-value ด้วย $objectToArray แล้วดึงเฉพาะ key (k)
สร้างข้อมูลตัวอย่าง
> db.demo740.insertOne({
"details": [
{ Name:"Chris", Age:21, CountryName:"US" },
{ Name:"Bob", Age:20, CountryName:"UK", isMarried:true }
]
});
แสดงข้อมูลทั้งหมด
> db.demo740.find();
ผลลัพธ์:
{ "_id" : ObjectId("5ead700c57bb72a10bcf066d"), "details" : [ { "Name" : "Chris", "Age" : 21, "CountryName" : "US" }, { "Name" : "Bob", "Age" : 20, "CountryName" : "UK", "isMarried" : true } ] }
คิวรีดึงเฉพาะชื่อฟิลด์ (keys) จากทุกอ็อบเจกต์ในอาร์เรย์ details
> db.demo740.aggregate([
{
$project: {
ListKeys: {
$reduce: {
input: "$details",
initialValue: [],
in: {
$concatArrays: [
"$$value",
{ $map: {
input: { $objectToArray: "$$this" },
in: "$$this.k"
}}
]
}
}
}
}
}
]).pretty()
ผลลัพธ์: รายการคีย์ทั้งหมด (ซ้ำได้)
{ "_id" : ObjectId("5ead700c57bb72a10bcf066d"), "ListKeys" : [ "Name", "Age", "CountryName", "Name", "Age", "CountryName", "isMarried" ] }