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

MongoDB เทียบเท่า SQL: SELECT DISTINCT(name) FROM collection WHERE age = 25

ใน MongoDB ใช้เมธอด distinct() เพื่อดึงค่าที่ไม่ซ้ำกัน (distinct values) ของฟิลด์หนึ่ง โดยสามารถระบุเงื่อนไข filter ได้ในพารามิเตอร์ที่สอง

ไวยากรณ์

db.collection.distinct("fieldName", { queryFilter })

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"John","Age":23});
{ "acknowledged": true, "insertedId": ObjectId("5cd12759e3526dbddbbfb60b") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{ "acknowledged": true, "insertedId": ObjectId("5cd12768e3526dbddbbfb60c") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"David","Age":25});
{ "acknowledged": true, "insertedId": ObjectId("5cd12773e3526dbddbbfb60d") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{ "acknowledged": true, "insertedId": ObjectId("5cd1277ee3526dbddbbfb60e") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Sam","Age":25});
{ "acknowledged": true, "insertedId": ObjectId("5cd12793e3526dbddbbfb60f") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});  // duplicate
{ "acknowledged": true, "insertedId": ObjectId("5cd127a3e3526dbddbbfb610") }
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});  // duplicate
{ "acknowledged": true, "insertedId": ObjectId("5cd127aae3526dbddbbfb611") }

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

> db.distinctNameAndAgeDemo.find().pretty();

คำสั่ง Distinct: ค้นหาชื่อที่ไม่ซ้ำกันของคนอายุ 25 ปี

> db.distinctNameAndAgeDemo.distinct("ClientFirstName", {"Age": 25});

ผลลัพธ์:

["Larry", "David", "Sam"]

คำสั่งนี้เทียบเท่า SQL:

SELECT DISTINCT ClientFirstName FROM distinctNameAndAgeDemo WHERE Age = 25;

การทำงานของ distinct()

  • สแกนเฉพาะเอกสารที่ตรงเงื่อนไข {"Age": 25}
  • รวบรวมค่า ClientFirstName ที่ไม่ซ้ำกัน
  • คืนค่าเป็น Array ของค่าที่ unique
  • Larry ปรากฏ 2 ครั้งในข้อมูล แต่มาแค่ครั้งเดียวในผลลัพธ์

ตัวเลือกเพิ่มเติม

  • ใช้ Aggregation $group + $addToSet สำหรับ distinct หลายฟิลด์พร้อมกัน
  • ใช้ db.collection.distinct("field") โดยไม่มี filter เพื่อ distinct ทั้งคอลเลกชัน