บทความนี้แนะนำการใช้ Operator $in เพื่อตรวจสอบว่า Array Field มีค่าที่ต้องการหรือไม่ เหมาะสำหรับการค้นหาเอกสารที่ Array Field ประกอบด้วยค่าเฉพาะ
สร้างข้อมูลตัวอย่าง
> db.valueInArrayDemo.insertOne({"UserName":"John","UserMessage":["Hi","Hello","Bye"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd684cf7924bb85b3f48959") }
> db.valueInArrayDemo.insertOne({"UserName":"Larry","UserMessage":["Thank You","Amazing","Nice"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd684d27924bb85b3f4895a") }
> db.valueInArrayDemo.insertOne({"UserName":"Carol","UserMessage":["Awesome","Bye","Cool"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd684d87924bb85b3f4895b") }
แสดงข้อมูลทั้งหมด
> db.valueInArrayDemo.find().pretty();
{
"_id" : ObjectId("5cd684cf7924bb85b3f48959"),
"UserName" : "John",
"UserMessage" : [ "Hi", "Hello", "Bye" ]
}
{
"_id" : ObjectId("5cd684d27924bb85b3f4895a"),
"UserName" : "Larry",
"UserMessage" : [ "Thank You", "Amazing", "Nice" ]
}
{
"_id" : ObjectId("5cd684d87924bb85b3f4895b"),
"UserName" : "Carol",
"UserMessage" : [ "Awesome", "Bye", "Cool" ]
}
ค้นหาเอกสารที่ UserMessage มีค่า "Bye"
> db.valueInArrayDemo.find({UserMessage:{$in:["Bye"]}});
ผลลัพธ์
{
"_id" : ObjectId("5cd684cf7924bb85b3f48959"),
"UserName" : "John",
"UserMessage" : [ "Hi", "Hello", "Bye" ]
}
{
"_id" : ObjectId("5cd684d87924bb85b3f4895b"),
"UserName" : "Carol",
"UserMessage" : [ "Awesome", "Bye", "Cool" ]
}
คำอธิบาย $in Operator
{ field: { $in: [value1, value2, ...] } }- คืนค่าเอกสารที่ field มีค่า อย่างน้อยหนึ่งค่า ใน Array ที่ระบุ- ใช้ได้กับทั้ง Array Field และ Scalar Field
- เทียบเท่ากับ OR หลายเงื่อนไข:
field = value1 OR field = value2 OR ...
ตัวอย่างเพิ่มเติม: ค้นหาหลายค่าพร้อมกัน
// หา User ที่มี Message เป็น "Bye" หรือ "Cool"
db.valueInArrayDemo.find({ UserMessage: { $in: ["Bye", "Cool"] } });
// หา User ที่ชื่อเป็น John, Larry, หรือ Carol
db.valueInArrayDemo.find({ UserName: { $in: ["John", "Larry", "Carol"] } });
ตัวอย่าง: $in กับ Array of Objects
// หาเอกสารที่ tags มี object ที่ name = "mongodb"
db.articles.find({ "tags.name": { $in: ["mongodb", "database"] } });