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

การจัดการข้อมูล Optional/Empty ใน MongoDB

การจัดการข้อมูล Optional/Empty (ค่าว่าง/ไม่มีค่า) ใน MongoDB

MongoDB เป็น Schema-less Database ฟิลด์อาจมีค่า null, ค่าว่าง (""), หรือไม่มีฟิลด์เลย (missing) ใช้ ออเปอเรเตอร์ $ne (not equal) เพื่อกรองข้อมูลที่ไม่ใช่ค่าที่ไม่ต้องการ

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

> db.handlingAndEmptyDataDemo.insertOne({"StudentName":"John","StudentCountryName":""});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cbd5ca629b87623db1b12") }
> db.handlingAndEmptyDataDemo.insertOne({"StudentName":"John","StudentCountryName":null});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cbd6ba629b87623db1b13") }
> db.handlingAndEmptyDataDemo.insertOne({"StudentName":"John"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cbd71a629b87623db1b14") }

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

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

ผลลัพธ์ (3 แบบ: Empty String, Null, Missing Field):

{ "_id" : ObjectId("5c9cbd5ca629b87623db1b12"), "StudentName" : "John", "StudentCountryName" : "" }
{ "_id" : ObjectId("5c9cbd6ba629b87623db1b13"), "StudentName" : "John", "StudentCountryName" : null }
{ "_id" : ObjectId("5c9cbd71a629b87623db1b14"), "StudentName" : "John" }

ค้นหาเอกสารที่ StudentCountryName ไม่เป็น null

> db.handlingAndEmptyDataDemo.find({StudentCountryName: {$ne: null}});

ผลลัพธ์ (พบเฉพาะ Empty String - Missing field ไม่ match):

{ "_id" : ObjectId("5c9cbd5ca629b87623db1b12"), "StudentName" : "John", "StudentCountryName" : "" }

ความแตกต่างระหว่าง null, "", และ Missing Field

Querynull"" (Empty)Missing Field
{field: {$ne: null}}❌✅ Match✅ Match*
{field: {$ne: ""}}✅ Match❌✅ Match*
{field: {$nin: [null, ""]}}❌❌✅ Match*
{field: {$exists: true, $ne: ""}}✅ Match❌❌
{field: {$exists: true, $ne: null}}❌✅ Match❌

* MongoDB ถือ Missing field = null สำหรับการเปรียบเทียบบางแบบ

Best Practices สำหรับการจัดการ Optional Fields

1. Schema Validation (MongoDB 3.2+)

db.createCollection("students", {
    validator: {
        $jsonSchema: {
            bsonType: "object",
            required: ["StudentName"],
            properties: {
                StudentName: { bsonType: "string" },
                StudentCountryName: { 
                    bsonType: ["string", "null"],
                    description: "Optional country name"
                }
            }
        }
    }
});

2. Default Values ใน Application Layer

// Node.js Example
const student = {
    StudentName: "John",
    StudentCountryName: req.body.country || "Unknown" // Default value
};

3. Query Patterns สำหรับ Optional Fields

// มีฟิลด์และไม่ว่าง
db.find({ field: { $exists: true, $ne: null, $ne: "" } })

// มีฟิลด์ (ยอมรับ null และ "")
db.find({ field: { $exists: true } })

// ไม่มีฟิลด์ หรือเป็น null หรือ ""
db.find({ 
    $or: [
        { field: { $exists: false } },
        { field: null },
        { field: "" }
    ]
})

4. ใช้ $ifNull ใน Aggregation

db.collection.aggregate([
    { $project: {
        country: { $ifNull: ["$StudentCountryName", "Not Specified"] }
    }}
]);

สรุปคำแนะนำ

  • กำหนด Standard ให้ชัดเจน: ใช้ null, "", หรือ missing field สำหรับ "ไม่มีค่า"
  • ใช้ Schema Validation เพื่อบังคับรูปแบบข้อมูล
  • จัดการ Default Value ที่ Application Layer
  • เลือก Query Operator ให้ตรงกับ Business Logic ที่ต้องการ