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

วิธีที่มีประสิทธิภาพที่สุดในการดึงเอกสารแรกและสุดท้ายใน MongoDB

ดึง First และ Last Document ด้วย Aggregation $first และ $last

บทความนี้สาธิตวิธีที่มีประสิทธิภาพสูงสุดในการดึงเอกสารแรก (First) และสุดท้าย (Last) ของ Collection โดยใช้ Aggregation Pipeline: $group พร้อม $first: "$$ROOT" และ $last: "$$ROOT"

ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง

> db.demo73.insertOne({"Name":"Chris"});
{ "acknowledged": true, "insertedId": ObjectId("5e29c41b71bf0181ecc4226c") }
> db.demo73.insertOne({"Name":"Bob"});
{ "acknowledged": true, "insertedId": ObjectId("5e29c41e71bf0181ecc4226d") }
> db.demo73.insertOne({"Name":"David"});
{ "acknowledged": true, "insertedId": ObjectId("5e29c42271bf0181ecc4226e") }

ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด

> db.demo73.find();

ผลลัพธ์: Chris, Bob, David (ตามลำดับ Insert/_id)

ขั้นตอนที่ 3: Aggregation หา First และ Last

> db.demo73.aggregate({
    $group: {
        _id: null,
        first: { $first: "$$ROOT" },
        last: { $last: "$$ROOT" }
    }
});

ผลลัพธ์ที่ได้

{ "_id": null, "first": { "_id": ObjectId("5e29c41b71bf0181ecc4226c"), "Name": "Chris" }, "last": { "_id": ObjectId("5e29c42271bf0181ecc4226e"), "Name": "David" } }

สรุป:

  • $$ROOT อ้างถึงเอกสารทั้งหมดใน Pipeline
  • $first และ $last ใน $group ต้องการการ Sort ก่อนหน้า (โดย Default ใช้ Natural Order / _id Order)
  • วิธีนี้มีประสิทธิภาพกว่า find().sort().limit(1) รัน 2 ครั้ง เพราะทำได้ใน 1 Pipeline